太好了!下面是一篇以**“【C++指南】STL list容器完全解读(一):从入门到掌握基础操作”**为主题的详细教学文案,适合初学者和进阶开发者理解 std::list
的工作机制和用法。篇幅可用于文章、课程讲义或讲解脚本。
【C++指南】STL list容器完全解读(一):从入门到掌握基础操作
✨ 这是你学习 C++ STL 双向链表 std::list
的起点,从最基础的概念到实战操作,一步步带你理解它的底层机制和使用场景。
🧠 一、什么是 std::list
?
std::list
是 C++ STL 提供的双向链表容器。
- 与
vector
不同,list
不支持随机访问,但在中间插入和删除时效率更高。
- 每个元素都存储在独立节点中,前后通过指针连接。
特点:
特性 | 说明 |
---|
双向链表 | 每个节点都有前驱和后继 |
插入删除快 | O(1) 时间复杂度 |
不支持随机访问 | 无法用 list[3] 访问元素 |
内存不连续 | 元素分散存储 |
🧰 二、基本定义与初始化
#include <iostream>
#include <list>
int main() {
std::list<int> l1; // 默认构造空链表
std::list<int> l2(5, 100); // 5个100
std::list<int> l3 = {1, 2, 3, 4, 5}; // 列表初始化
for (int val : l3) {
std::cout << val << " ";
}
return 0;
}
🛠 三、常用操作方法
✅ 插入元素
方法 | 说明 |
---|
push_back() | 末尾插入 |
push_front() | 头部插入 |
insert() | 任意位置插入(基于迭代器) |
std::list<int> lst = {1, 2, 3};
lst.push_back(4); // 1 2 3 4
lst.push_front(0); // 0 1 2 3 4
auto it = lst.begin();
std::advance(it, 2);
lst.insert(it, 99); // 0 1 99 2 3 4
✅ 删除元素
方法 | 说明 |
---|
pop_back() | 删除最后一个元素 |
pop_front() | 删除第一个元素 |
erase() | 删除指定位置或区间 |
remove(val) | 删除所有值为 val 的元素 |
clear() | 清空列表 |
lst.pop_back(); // 删除末尾元素
lst.erase(lst.begin()); // 删除第一个元素
lst.remove(99); // 删除所有 99
lst.clear(); // 清空列表
🧭 四、遍历方式总结
✅ 使用范围 for 循环
for (int val : lst) {
std::cout << val << " ";
}
✅ 使用迭代器
for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {
std::cout << *it << " ";
}
✅ 使用反向迭代器
for (auto rit = lst.rbegin(); rit != lst.rend(); ++rit) {
std::cout << *rit << " ";
}
📦 五、重要函数一览(基础)
函数 | 含义 |
---|
size() | 元素数量 |
empty() | 是否为空 |
front() / back() | 访问首尾元素 |
assign(n, val) | 重新赋值为 n 个 val |
swap(list2) | 与另一个 list 交换内容 |
unique() | 去重(需先排序) |
sort() | 排序(稳定排序) |
reverse() | 反转 list 顺序 |
🔍 六、list 与 vector 对比
功能点 | list | vector |
---|
内存结构 | 链式存储 | 连续存储 |
插入/删除效率 | 高(任意位置) | 低(中间位置需移动) |
访问效率 | 低 | 高(随机访问) |
使用场景 | 频繁插入/删除 | 频繁访问/查找 |
🧪 七、实战小练习:合并两个 list 并排序去重
#include <iostream>
#include <list>
int main() {
std::list<int> a = {1, 3, 5, 7};
std::list<int> b = {2, 3, 6, 7, 8};
a.merge(b); // 合并后 b 清空,前提是两个都已排序
a.sort(); // 排序
a.unique(); // 去重
for (auto val : a)
std::cout << val << " ";
return 0;
}
🧱 八、总结:本节你学会了什么?
std::list
是双向链表,适合频繁插入和删除
- 掌握了 list 的声明、插入、删除、遍历等基础操作
- 熟悉了 list 与 vector 的对比与适用场景
- 了解了 list 的函数族:insert、erase、sort、unique 等
🧩 下一节预告:
【C++指南】STL list容器完全解读(二):深度探索迭代器、splice合并、底层机制剖析
如你需要这部分内容导出为 Markdown 文件、配图讲义、配套 PPT 或教学视频脚本,我也可以继续为你生成,是否要继续?
发表回复