C++ STL list详解:插入删除与遍历

5星 · 超过95%的资源 3 下载量 84 浏览量 更新于2024-08-28 收藏 75KB PDF 举报
"这篇文章除了介绍C++ STL中的list容器的基本概念和特性外,还探讨了如何构造、操作和遍历list容器,包括插入、删除、排序、合并等高级功能。" C++标准模板库(STL)提供了一个名为`list`的容器,它实现了一个双向链表的数据结构。`list`主要适用于需要频繁插入和删除元素的场景,因为这些操作在链表中通常比在数组或向量中更高效。尽管`list`不支持随机访问,但它允许通过迭代器进行顺序访问。 **构造与析构** - `list<Elem> c`:创建一个空的`list`,其中`Elem`是存储元素的类型。 - `list<Elem> c1(c2)`:创建一个与`c2`相同类型的`list`副本。 - `list<Elem> c(n)`:创建包含`n`个元素的新`list`,元素由默认构造函数初始化。 - `list<Elem> c(n, elem)`:创建包含`n`个值为`elem`的元素的`list`。 - `list<Elem> c(begin, end)`:使用迭代器`begin`和`end`之间的范围创建`list`。 **成员函数** - `c.~list()`:销毁容器中的所有元素并释放内存。 - `c.size()`:返回`list`中的元素数量。 - `c.swap(c2)`:交换`c`和`c2`的元素。 - `c.empty()`:检查`list`是否为空。 - `c.max_size()`:返回`list`能容纳的最大元素数量。 - `c.resize(num)`:调整`list`大小至`num`,如果需要,可以插入或删除元素。 - `c.reverse()`:反转`list`中的元素顺序。 - `c.sort()`:对`list`进行排序,默认为升序,可以通过传递比较函数自定义排序规则。 **高级操作** - `c.merge()`:合并两个已排序的`list`,结果仍然是有序的。 - `c.splice()`:将一个`list`的部分或全部插入到另一个`list`中,保持链接结构。这包括三个重载版本,允许在不同位置插入,并可以选择保留原链表结构。 **示例代码** - `L1.sort()`:将`L1`排序,假设元素是可比较的。 - `L1.sort(greater<int>())`:将`L1`按降序排序。 - `list1.merge(list2)`:合并两个升序的`list`,`list2`变为空。 - `L1.splice(++list1.begin(), list2)`:将`list2`的所有元素插入到`list1`的第二个位置。 **遍历与操作** - 使用`list<int>::iterator it`,可以遍历`list`中的元素,执行添加、删除或修改操作。 - 由于`list`不支持随机访问,所以没有`at()`或`operator[]`方法。可以使用`push_back()`、`push_front()`、`pop_back()`、`pop_front()`等方法添加或移除元素,以及`insert()`和`erase()`进行插入和删除操作。 **性能考量** - `list`在插入和删除元素时效率较高,特别是当插入和删除位置不在末尾时。 - 但在需要随机访问或连续元素操作的情况下,`vector`可能更合适,因为它提供了更快的访问速度。 C++的`list`容器在处理动态数据集时提供了一种灵活且高效的解决方案,尤其适合需要在任意位置频繁插入和删除元素的场景。了解其特性和操作方式对于编写高效C++代码至关重要。