C++--STL库-List
目录
1.list 的基本使用
1.1 创建和初始化
1.2. 插入元素
1.3. 删除元素
1.4. 访问元素
1.5 遍历
1.6 总结
list是C++标准库(STL)中的双向链表容器,属于<list>头文件。
它的特点是:
动态大小:可以随时插入或删除元素,不需要手动管理内存。
双向链表:每个节点都连接前后两个节点,支持双向遍历。
高效插入删除:插入和删除的时间复杂度是O(1),比vector快(vector可能会移动大量元素)。
随机访问慢:不像vector可以直接访问vec[i],list只能顺序遍历(O(n))。
1.list的基本使用
1.1创建和初始化
std::list<int> lst1; // 创建空 list std::list<int> lst2 = {1, 2, 3, 4, 5}; // 用初始化列表创建 std::list<int> lst3(5, 100); // 创建 5 个元素,每个值都为 100 std::list<int> lst4(lst2); // 拷贝构造1.2. 插入元素
lst.push_back(10); // 尾部插入 10 lst.push_front(5); // 头部插入 5 auto it = lst.begin(); std::advance(it, 2); // 迭代器前进 2 步 lst.insert(it, 99); // 在第 3 个位置插入 991.3. 删除元素
lst.pop_back(); // 删除最后一个元素 lst.pop_front(); // 删除第一个元素 auto it = lst.begin(); std::advance(it, 1); lst.erase(it); // 删除第二个元素 lst.remove(3); // 删除所有值为 3 的元素 lst.clear(); // 清空 list1.4. 访问元素
std::cout << lst.front(); // 访问第一个元素 std::cout << lst.back(); // 访问最后一个元素1.5 遍历
// 方式 1:使用范围 for for (int num : lst) { std::cout << num << " "; } // 方式 2:使用迭代器 for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) { std::cout << *it << " "; }1.6 总结
| 区别 | vector(动态数组) | list(双向链表) |
| 底层结构 | 动态数组(连续内存) | 双向链表(分散存储) |
| 访问速度 | 随机访问快 (O(1)) | 随机访问慢 (O(n)) |
| 插入删除 | 尾部操作快 (O(1)),中间插入/删除慢 (O(n)) | 任意位置插入/删除快 (O(1)) |
| 内存使用 | 连续存储,节省空间,但可能需要扩容 | 每个节点有额外指针开销,内存占用较大 |
| 遍历方式 | 支持 [],可用 +、- 运算符 | 只能用迭代器 ++ 或 -- |
pair<>:这是 C++ 标准库里的“对组”或“二元组”。它里面可以装两个不同类型的数据。比如pair<int, string>就是“一个整数 + 一个字符串”捆绑在一起。list<>:这就是我们刚才聊的链表容器(双向链表)。合在一起
list<pair<A, B>>:意思就是——这个链表里,每一个节点存储的数据,不再是一个普通的数字,而是一个“小包裹”(pair)。
