
@toc
在C++标准模板库(STL)中,list是一个基于双向链表实现的序列容器。它允许在任意位置进行高效插入和删除操作,时间复杂度为O(1)。与vector不同,list不保证元素在内存中的连续存储,因此不支持随机访问。


构造函数的重载版本

函数 | 功能描述 | 示例 |
|---|---|---|
默认构造函数 | 创建空list |
|
填充构造函数 | 创建包含n个元素的list |
|
拷贝构造函数 | 复制另一个list的内容 |
|
移动构造函数(C++11) | 转移另一个list的资源 |
|
析构函数 | 自动释放内存(通常无需手动调用) |
|
拷贝赋值运算符 | 深拷贝赋值操作 |
|
移动赋值运算符(C++11) | 高效转移资源赋值操作 |
|
// 初始化列表构造(C++11)
list<string> fruits {"apple", "banana", "cherry"};
函数 | 功能 | 示例 |
|---|---|---|
| 返回指向第一个元素的迭代器 |
|
| 返回末尾哨兵迭代器 |
|
| 返回反向起始迭代器 |
|
| 返回反向结束迭代器 |
|
函数 | 功能 | 示例 |
|---|---|---|
| 返回不可修改的正向起始迭代器 |
|
| 返回不可修改的正向结束迭代器 |
|
| 返回不可修改的反向起始迭代器 |
|
| 返回不可修改的反向结束迭代器 |
|
list<int> nums {1,2,3};
// 正向遍历
for(auto it = nums.begin(); it != nums.end(); ++it) {
cout << *it << " "; // 输出:1 2 3
}
函数 | 功能 | 示例 |
|---|---|---|
| 返回元素数量 |
|
| 判断容器是否为空 |
|
函数 | 功能 | 示例 |
|---|---|---|
| 访问首元素(可修改) |
|
| 访问尾元素(可修改) |
|
list<double> temps {36.5, 37.1, 38.0};
temps.front() = 35.9; // 修改首元素
cout << "当前体温:" << temps.back(); // 输出38.0
函数 | 功能 | 示例 |
|---|---|---|
| 头部插入元素 |
|
| 头部直接构造元素 |
|
| 删除头部元素 |
|
| 尾部插入元素 |
|
| 尾部直接构造元素 |
|
| 删除尾部元素 |
|
| 清空所有元素 |
|
push_back vs emplace_back:
class Student {
public:
Student(int id, string name) : id(id), name(name) {}
private:
int id;
string name;
};
list<Student> roster;
roster.push_back(Student(101, "Alice")); // 构造临时对象+拷贝
roster.emplace_back(102, "Bob"); // 直接构造(高效)函数 | 功能 | 示例 |
|---|---|---|
| 用n个val替换内容 |
|
| 用迭代器范围替换内容 |
|
| 交换两个list的内容 |
|
| 调整元素数量 |
|
| 调整数量并用val填充新增元素 |
|
list<int> nums;
nums.assign({1,2,3}); // 内容变为[1,2,3]
nums.resize(5); // 变为[1,2,3,0,0]
nums.resize(3); // 截断为[1,2,3]iterator insert(iterator pos, const T& val); // 单元素插入
void insert(iterator pos, size_t n, const T& val); // 批量插入
void insert(iterator pos, InputIt first, InputIt last); // 范围插入iterator erase(iterator pos); // 删除单个元素
iterator erase(iterator first, iterator last); // 删除区间元素示例:
list<int> data {10,20,30};
auto it = data.begin();
advance(it, 1);
data.insert(it, 15); // [10,15,20,30]
data.insert(it, 2, 18); // [10,15,18,18,20,30]
vector<int> tmp {25,35};
data.insert(data.end(), tmp.begin(), tmp.end()); // 末尾追加
data.erase(it); // 删除第二个18
函数 | 功能 | 示例 |
|---|---|---|
| 删除所有等于val的元素 |
|
| 删除满足条件的元素 |
|
list<int> nums {1,2,3,2,5};
nums.remove(2); // 删除所有2 → [1,3,5]
nums.remove_if([](int x){ return x>3; }); // → [1,3]函数 | 功能 | 示例 |
|---|---|---|
| 删除连续重复元素 |
|
| 合并有序链表 |
|
| 排序元素(升序) |
|
| 转移另一个链表的元素 |
|
list<int> a {1,3,5}, b {2,4,6};
a.merge(b); // a变为[1,2,3,4,5,6], b为空
a.sort(); // 排序(若未有序)
list<int> x {10,20}, y {30,40};
auto pos = x.begin();
x.splice(pos, y); // x变为[30,40,10,20], y为空本文详细介绍了C++ list容器的基本特性和使用方法。通过大量的代码示例,我们学习了如何正确使用list进行元素的增删改查操作。list作为STL中重要的序列式容器,其独特的链表结构使其在特定场景下具有不可替代的优势。
在接下来的系列文章中,我们将深入探讨:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。