C++ STL中的list
list
是C++标准模板库(STL)中的一个序列容器,它实现了一个双向链表。与vector
和deque
相比,list
支持快速的任意位置插入和删除操作,但不支持快速随机访问。
基本操作
-
创建和初始化
cpp#include <list> std::list<int> l1; // 创建一个空的list std::list<int> l2(5, 10); // 创建一个大小为5的list,每个元素初始化为10 std::list<int> l3 = {1, 2, 3, 4, 5}; // 初始化列表
-
访问元素
front()
和back()
:访问第一个和最后一个元素。list
不支持operator[]
和at()
,因为它不提供随机访问。
cppint first = l3.front(); // 1 int last = l3.back(); // 5
-
修改元素
push_back(value)
和push_front(value)
:在list的末尾或开头添加一个元素。pop_back()
和pop_front()
:移除list的最后一个或第一个元素。insert(position, value)
:在指定位置插入一个元素。erase(position)
或erase(start, end)
:删除一个或多个元素。clear()
:清空所有元素。
cppl3.push_back(6); // l3: {1, 2, 3, 4, 5, 6} l3.push_front(0); // l3: {0, 1, 2, 3, 4, 5, 6} l3.pop_back(); // l3: {0, 1, 2, 3, 4, 5} l3.pop_front(); // l3: {1, 2, 3, 4, 5} auto it = l3.begin(); std::advance(it, 2); // 移动迭代器到第三个元素 l3.insert(it, 99); // l3: {1, 2, 99, 3, 4, 5} l3.erase(it); // l3: {1, 2, 3, 4, 5}
-
大小
size()
:返回当前元素的数量。empty()
:检查容器是否为空。
cppsize_t num_elements = l3.size(); // 5 bool is_empty = l3.empty(); // false
-
遍历
- 使用迭代器进行遍历。
cppfor (int x : l3) std::cout << x << " "; for (auto it = l3.begin(); it != l3.end(); ++it) std::cout << *it << " ";
相关算法
list
可以与STL中的算法库配合使用,但由于其内部结构是链表,某些基于随机访问的算法(如std::sort
)不适用。不过,list
提供了自己的成员函数来处理排序和其他操作。
-
排序
- 使用
list
的成员函数sort()
,因为标准的std::sort
要求随机访问迭代器。
cppl3.sort(); // 对list进行排序 ```
- 使用
-
反转
- 使用
list
的成员函数reverse()
来反转元素。
cppl3.reverse(); // 反转list中的元素
- 使用
-
查找
cppauto it = std::find(l3.begin(), l3.end(), 3); if (it != l3.end()) { std::cout << "Element found: " << *it << std::endl; }
-
计数
cppint count = std::count(l3.begin(), l3.end(), 3);
-
删除特定元素
- 使用
remove()
成员函数直接删除所有匹配的元素。
cppl3.remove(3); // 删除所有值为3的元素
- 使用
-
遍历并执行操作
cppstd::for_each(l3.begin(), l3.end(), [](int& x){ x *= 2; });
list
是一个非常有用的容器,特别是在需要频繁插入和删除操作时。它的灵活性使得在处理非连续存储的数据结构时非常高效。通过结合STL的算法,可以有效地管理和处理存储在list
中的数据。