C++ 中的 std::list
是一种双向链表容器,属于标准模板库(STL)的一部分。
1、list 特点
- 由于其底层实现为双向链表,
std::list
在任意位置插入和删除元素都非常高效,时间复杂度为 O(1)。 - 由于链表元素不存储在连续的内存中,插入和删除操作不会使迭代器失效(除非删除的是迭代器指向的元素)。
- 与数组或向量不同,
std::list
不能进行常数时间的随机访问,遍历元素的时间复杂度为 O(n)。
2、常见操作与方法
2.1、构造函数
list<int> l1; // 构造空链表
list<int> l2(5); // 构造一个包含 5 个默认值元素的链表
list<int> l3(5,10); // 构造一个包含 5 个元素的链表,并全部初始化为 10
list<int> l4({1,2,3,4,5}); // 用初始化列表构造链表
list<int> l5(l2); // 拷贝构造
2.2、元素访问
-
front()
: 返回第一个元素的引用。 -
back()
: 返回最后一个元素的引用。
2.3、迭代器
-
begin()
: 返回指向链表第一个元素的迭代器。 -
end()
: 返回指向链表末尾之后的迭代器。 -
rbegin()
,rend()
: 返回逆序迭代器,分别指向最后一个元素和第一个元素之前的位置。
2.4、长度
-
empty()
: 判断链表是否为空。 -
size()
: 返回链表中的元素数量。 -
max_size()
: 返回链表可以存储的最大元素数。
2.5、修改器
-
clear()
: 清空链表,删除所有元素。 -
insert(iterator pos, const T& value)
: 在迭代器pos
指向的位置之前插入元素value
。 -
emplace(iterator pos, Args&&... args)
: 在指定位置原地构造元素。 -
erase(iterator pos)
: 删除pos
处的元素。 -
push_back(const T& value)
: 在链表尾部插入元素。 -
emplace_back(Args&&... args)
: 在链表尾部原地构造元素。 -
push_front(const T& value)
: 在链表头部插入元素。 -
emplace_front(Args&&... args)
: 在链表头部原地构造元素。 -
pop_back()
: 删除链表尾部元素。 -
pop_front()
: 删除链表头部元素。 -
resize(size_type count)
: 调整链表大小。 -
swap(list& other)
: 交换两个链表的内容。
2.6、特殊操作
-
splice
: 将其他链表的元素移入当前链表。 -
remove
: 删除所有等于指定值的元素。 -
remove_if
: 根据谓词删除元素。 -
unique
: 删除相邻的重复元素。 -
merge
: 合并两个有序链表。 -
sort
: 对链表进行排序。 -
reverse
: 反转链表中的元素顺序。