STL容器中 list(双向链表)的增删改查

ops/2024/11/9 16:43:02/

list(双向链表

std::list 是 C++ 标准模板库(STL)中的一个容器,它实现了一个双向链表。双向链表中的每个元素都包含三个部分:存储数据的元素本身、指向前一个元素的指针(或迭代器)、以及指向后一个元素的指针(或迭代器)。这使得在链表的任何位置进行插入和删除操作都非常高效,因为这些操作只需要改变指针的指向,而不需要移动其他元素。然而,与数组或 std::vector 相比,随机访问元素的速度较慢,因为访问元素需要从头或尾开始遍历链表list支持快速的插入和删除操作,但不支持随机访问。

#include <iostream>  
#include <list>  int main() {  std::list<int> lst;  // 向list中添加元素  lst.push_back(10);  lst.push_front(5);  // 遍历list  for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {  std::cout << "元素: " << *it << std::endl;  }  // 使用范围for循环遍历list(需要C++11及以后,并包含<initializer_list>)  // 注意:直接的范围for循环不适用于std::list,但可以使用其他方式模拟  return 0;  
}  // 注意:由于list不支持随机访问迭代器,因此不能直接使用范围for循环。  
// 可以通过C++11的auto和基于范围的for循环来遍历list,但通常需要额外的辅助,如std::begin和std::end。

插入元素

向 std::list 中插入元素可以使用 insert 方法。它可以在指定位置之前插入一个新元素,也可以插入一个元素范围。

#include <iostream>  
#include <list>  int main() {  std::list<int> myList = {1, 2, 4};  // 在第二个元素之前插入3  auto it = myList.begin();  std::advance(it, 1); // 移动迭代器到第二个元素  myList.insert(it, 3);  // 遍历并打印  for (int elem : myList) {  std::cout << elem << " ";  }  std::cout << std::endl;  return 0;  
}

删除元素

删除元素可以使用 erase 方法,该方法删除迭代器指向的元素,并返回指向下一个元素的迭代器。

#include <iostream>  
#include <list>  int main() {  std::list<int> myList = {1, 2, 3, 4};  // 删除值为3的元素  for (auto it = myList.begin(); it != myList.end(); ) {  if (*it == 3) {  it = myList.erase(it); // 注意,这里迭代器需要更新  } else {  ++it;  }  }  // 遍历并打印  for (int elem : myList) {  std::cout << elem << " ";  }  std::cout << std::endl;  return 0;  
}

修改元素

修改元素非常简单,直接通过迭代器访问并修改其值。

#include <iostream>  
#include <list>  int main() {  std::list<int> myList = {1, 2, 3, 4};  // 修改第二个元素为10  auto it = myList.begin();  std::advance(it, 1); // 移动到第二个元素  *it = 10;  // 遍历并打印  for (int elem : myList) {  std::cout << elem << " ";  }  std::cout << std::endl;  return 0;  
}

遍历元素

遍历 std::list 可以使用范围基于的for循环(如上面示例所示),或者使用迭代器手动遍历。

#include <iostream>  
#include <list>  int main() {  std::list<int> myList = {1, 2, 3, 4};  // 使用迭代器遍历  for (auto it = myList.begin(); it != myList.end(); ++it) {  std::cout << *it << " ";  }  std::cout << std::endl;  return 0;  
}


http://www.ppmy.cn/ops/102658.html

相关文章

vs2019 C++ 无法定位程序输入点于动态链接库

问题 一个项目一段时间没运行后&#xff0c;再运行报以下错误&#xff1a; 无法定位程序输入点??0lnferenceEngineExceptiondetailslnferenceEngine QEAAAEBV? b a s i c s t r i n g D U ? basic stringDU? basicstringDU?char traitsDstd v?$allocatorD2 stdHOZ 于动…

Java基础(多态)

目录 一、什么是多态 二、多态实现的必要条件 三、多态的特点 四、引用类型转换 五、通过一个题目来分析多态的使用 后言 一、什么是多态 多态是同一个行为具有多个不同的表现形式或形态的能力 二、多态实现的必要条件 在多态中必须存在有继承或实现关系的子类和父类子…

Element Plus 的 ColorPicker 颜色选择器:定制按钮

截止至 饿了么 Element Plus 2.8.1版本的组件库&#xff0c;color picker组件不支持自定义颜色选择弹窗里的按钮&#xff01;&#xff01;&#xff01;只好另辟蹊径解决这个问题。 <template><div class"color_box flex between"><el-color-pickerre…

5G无线电链路监控(Radio Link Monitoring,简称RLM)

5G支持在无线电链路监控&#xff08;Radio Link Monitoring&#xff0c;简称RLM&#xff09;上的应用。 首先&#xff0c;我们来理解什么是RLM。在移动通信中&#xff0c;无线电链路监控&#xff08;RLM&#xff09;是一个关键功能&#xff0c;它负责监测和评估无线链路的状况。…

XML 数据格式介绍及其应用

由于篇幅限制&#xff0c;我将提供一个较为精简的介绍&#xff0c;覆盖XML数据格式的基础知识、应用领域以及与Python数据类型的关系等内容。 XML 数据格式介绍及其应用 XML (eXtensible Markup Language) 是一种标记语言&#xff0c;用于定义数据的结构和含义。与 HTML 相比…

IoT客户端+联邦学习微调大模型

大型模型的训练涉及到微调&#xff0c;微调则面临着高质量数据的稀缺性。与基于集中式数据中心的解决方案相比&#xff0c;物联网-IoT中大型模型的更新面临着分布式客户端私有且异构数据的协调挑战。为了解决这一挑战&#xff0c;作者提出了KOALA来推动物联网中大模型的训练。由…

游卡,三七互娱,得物,顺丰,快手,oppo,莉莉丝,埃科光电,康冠科技,途游游戏25秋招内推

游卡&#xff0c;三七互娱&#xff0c;得物&#xff0c;顺丰&#xff0c;快手&#xff0c;oppo&#xff0c;莉莉丝&#xff0c;埃科光电&#xff0c;康冠科技&#xff0c;途游游戏25秋招内推 ①顺丰 【招聘岗位】研发、算法、大数据、产品、项管、设计、人资等 【官方内推码】4…

Qt 线程与窗体之间的传值

QThread 和窗口之间的通信通常通过信号和槽机制来实现 也可以直接通过调用线程中的值 效果图(Dialog To hello; TextLabel To hello) 在主窗口类中创建线程实例&#xff0c;并连接线程发出的信号到主窗口的槽函数。 .h #ifndef TESTAPP_H #define TESTAPP_H#include <QD…