1. STL list 容器概述
STL(Standard Template Library)中的list容器是一个双向链表实现的数据结构,它允许在常数时间内进行插入和删除操作。与vector不同,list不支持随机访问,但它在中间位置的插入和删除操作效率更高。
list容器特别适合以下场景:
- 需要频繁在序列中间插入或删除元素
- 不需要随机访问元素
- 需要保证迭代器在插入和删除操作后仍然有效
在实际项目中,我经常使用list来处理需要频繁修改的数据序列,比如游戏中的对象管理、事件队列等场景。它的性能特性使得在这些场景下比vector更高效。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. list 的基本使用
2.1 创建和初始化list
创建list有多种方式,以下是最常见的几种:
cpp复制#include <list>
#include <vector>
// 空list
std::list<int> list1;
// 包含5个元素,每个都是0
std::list<int> list2(5);
// 包含5个元素,每个都是42
std::list<int> list3(5, 42);
// 从数组初始化
int arr[] = {1, 2, 3, 4, 5};
std::list<int> list4(arr, arr + sizeof(arr)/sizeof(arr[0]));
// 从vector初始化
std::vector<int> vec = {6, 7, 8, 9, 10};
std::list<int> list5(vec.begin(), vec.end());
// 使用初始化列表(C++11)
std::list<int> list6 = {11, 12, 13, 14, 15};
在实际开发中,我更喜欢使用初始化列表方式,因为它最简洁直观。但要注意,初始化列表是C++11引入的特性,在老项目中可能需要考虑兼容性。
2.2 list的常用操作
list提供了一系列成员函数来操作元素:
cpp复制std::list<int> myList = {1, 2, 3};
// 添加元素
myList.push_back(4); // 末尾添加
myList.push_front(0); // 开头添加
// 删除元素
myList.pop_back(); // 删除末尾元素
myList.pop_front(); // 删除开头元素
// 插入元素
auto it = myList.begin();
std::advance(it, 2); // 移动迭代器到第3个位置
myList.insert(it, 10); // 在指定位置插入
// 删除元素
it = myList.begin();
std::advance(it, 1);
myList.erase(it); // 删除指定位置的元素
// 获取大小
size_t size = myList.size();
// 检查是否为空
bool isEmpty = myList.empty();
// 清空list
myList.clear();
注意:list没有提供类似vector的operator[]或at()方法,因为它不支持随机访问。要访问特定位置的元素,必须使用迭代器遍历。
2.3 list的迭代器使用
list的迭代器是双向迭代器,支持++和--操作,但不支持+或-操作:
cpp复制std::list<int> myList = {1, 2, 3, 4, 5};
// 正向遍历
for(auto it = myList.begin(); it != myList.end(); ++it) {
std::cout << *
