前言:
C++ 标准模板库(STL)中的 list 容器是一种双向链表数据结构,它允许在常数时间内进行插入和删除操纵,而无需重新分配整个容器或移动大量元素。list 容器由一系列节点组成,每个节点包含数据部门和指向前后节点的指针,这种结构使得 list 在某些场景下非常高效。本文将重点先容 list 容器的内存存储机制及其常见用法。
一、list 详解
1、内存管理
list 容器的内存存储特点重要体现在以下几个方面:
- 非连续存储: 与数组不同,list 的元素不存储在连续的内存块中。每个元素(节点)包含数据部门以及指向前后节点的指针。这种结构使得 list 可以或许机动地在任意位置进行插入和删除操纵。
- 动态内存分配: 每次插入新元素时,list 会动态分配新的节点内存。这种机制避免了像 vector 那样在插入或删除元素时大概必要重新分配整个容器的内存,从而减少了内存碎片化的风险。
- 双向链表: 每个节点包含两个指针,一个指向前一个节点(prev),另一个指向下一个节点(next)。这使得 list 可以或许在常数时间内向前或向后遍历。
2、常用操纵
- push_back(const T& value): 在 list 的末尾添加一个元素。
- push_front(const T& value): 在 list 的开头添加一个元素。
- pop_back() : 移除 list 的最后一个元素。
- pop_front(): 移除 list 的第一个元素。
- insert(iterator pos, const T& value): 在指定位置插入一个元素。
- erase(iterator pos): 移除指定位置的元素。
- erase(iterator first, iterator last): 移除指定范围内的元素。
- clear(): 移除 list 中的全部元素。
- sort(): 对 list 进行排序。
- sort(Compare comp) : 使用自定义比力函数对 list 进行排序。
- reverse():反转 list 中元素的次序。
3、迭代器+erase()删除list中的元素
std::list 是一个双向链表容器,它提供了 erase 成员函数来删除元素。这个函数继承一个迭代器作为参数,该迭代器指向要删除的元素。调用 erase 后,该元素会从 list 中移除,而且 erase 会返回一个指向被删除元素之后位置的迭代器(如果存在的话;如果删除的是最后一个元素,则返回 end())。
示例:
- #include <iostream>
- #include <list>
-
- int main() {
- // 创建一个 list 并初始化
- std::list<int> myList = {1, 2, 3, 4, 5};
-
- // 打印原始 list
- std::cout << "Original list: ";
- for (int val : myList) {
- std::cout << val << " ";
- }
- std::cout << std::endl;
-
- // 创建一个迭代器指向要删除的元素(例如,值为 3 的元素)
- auto it = std::find(myList.begin(), myList.end(), 3);
-
- // 检查是否找到了该元素
- if (it != myList.end()) {
- // 删除元素,并获取删除后下一个元素的迭代器
- it = myList.erase(it); // 注意:这里我们更新了 it 的值
-
- // 可选:打印删除后的 list
- std::cout << "List after erasing 3: ";
- for (int val : myList) {
- std::cout << val << " ";
- }
- std::cout << std::endl;
- } else {
- std::cout << "Element 3 not found in the list." << std::endl;
- }
-
- // 注意:如果你不打算使用擦除后返回的迭代器(即不关心擦除后的下一个元素),
- // 你也可以不更新 it,但之后不要使用它,因为它现在是一个无效迭代器。
-
- return 0;
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |