List 介绍
List 是 C++ 标准模板库(STL)中的一种容器,内存存储不连续,通过指针连接前一个节点和后一个节点。相比 vector,它在频繁插入删除操作中有 O(1) 的时间复杂度优势,但牺牲了随机访问性能。
本文重点在于理解 list 的结构以及迭代器的实现。
List 实例化
list<类型> 定义数据类型,例如:
// List 实例化
std::list<int> v;
std::list<int> v{1, 2, 3, 4, 5};
注意:list 初始化时不能像 vector 那样直接传入列表,需使用构造函数或 push_back。
尾插元素
使用 push_back 接口:
std::list<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
访问元素
支持迭代器的容器支持 auto 关键字。stack、queue、priority_queue 不支持迭代器。 可以通过迭代器访问元素:
auto it = v.begin();
while (it != v.end()) {
std::cout << *it << " ";
it++;
}
std::cout << std::endl;
// range-based for loop
for (auto e : v) {
std::cout << e << " ";
}
由于 list 内存不连续,不能使用 + 进行偏移,只能使用 ++(基于运算符重载指向下一个节点)。
指定位置前插入
使用 insert 接口:
v.insert(v.begin(), 5);
注意: list 内存不连续,不能直接使用 + 计算地址。insert 之后对于 list 的迭代器通常不会失效(除非插入位置导致内存重新分配,但 list 节点独立,一般不影响其他迭代器)。
指定位置删除
使用 erase 接口:
v.erase(v.());


