C++ list核心接口与实战技巧
一. list 是什么?先搞懂底层结构
list 的本质是双向循环链表,且带有一个"哨兵位头结点"(不存储有效数据),结构如下

- 双向:每个字节包含前驱指针 (prev) 和后继指针 (next) ,支持向前,向后遍历;
- 循环:尾节点的 next 指向头结点,头结点的 prev 指向尾结点,形成闭环;
- 哨兵位头结点:避免插入/删除时判断"是否为空"”是否为头结点“的麻烦,简化代码逻辑。
这种结构决定了 list 的核心特性:任意位置插入/删除效率高(O(1)),但不支持随机访问(也就是下标访问)(访问元素需要遍历,O(N))。 头文件包含:
代码语言:javascript
AI代码解释
#include<iostream>
#include<list>
using namespace std;
list文档:http://www.cplusplus.com/reference/list/list/?kw=list
二. list核心接口使用:从构造到修改
list 的接口丰富,但重点掌握"构造,迭代器,容量,元素访问,修改’五大类即可满足日常开发需求,以下结合代码示例讲解。
2.1 构造函数:构造一个list对象
|
构造函数( (constructor)) |
接口说明 |
|---|---|
|
list (size_type n, const value_type& val = value_type()) |
构造的list中包含n个值为val的元素 |
|
list() |
构造空的list |
|
list (const list& x) |
拷贝构造函数 |
|
list (InputIterator first, InputIterator last) |
用[first, last)区间中的元素构造list |
- list (size_type n, const value_type& val = value_type())
用n个val值的构造
代码语言:javascript
AI代码解释
void testList1()
{
list<int> lt1(10, 1);
for (auto e : lt1)
{
cout << e << " ";
}
}
- list()
构造一个空的list,只包含一个头结点(哨兵位)
代码语言:javascript
AI代码解释
void testList1()
{
list<int> lt2;
for (auto e : lt2)
{
cout << e << " ";
}
}
- list (const list& x)
拷贝构造,用一个已经创建好的List对象去初始化另一个要创建的对象
代码语言:javascript
AI代码解释
void testList1()
{
list<int> lt1(10, 1);
list<int> lt3(lt1);
for (auto e : lt3)
{
cout << e << " ";
}
cout << endl;
}
- list (InputIterator first, InputIterator last)
用 [first, last) 的迭代区间构造
代码语言:javascript
AI代码解释
void testList1()
{
list<int> lt1(10, 1);
list<int> lt4(lt1.begin(), lt1.end());
for (auto e : lt4)
{
cout << e << " ";
}
cout << endl;
}
2.2 迭代器:遍历list的 “指针”
list 的迭代器本质是 “结点指针的封装”,支持正向和反向遍历,核心接口如下(当然也可以使用范围for):
|
函数声明 |
接口说明 |
|---|---|
|
begin + end |
返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器 |
|
rbegin + rend |
返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置 |
此处,大家可暂时将迭代器理解成一个指针,该指针指向list中的某个节点。 图片演示:
- begin + end

- rbegin + rend

迭代器知识补充:

- list:双向
- vector:随机 和数组相关的都是随机迭代器
- string:随机

2.3 容量与元素访问:判断空、查大小、取首尾
list 不支持随机访问(没有 operator[] 和 at()),仅提供 “判断空、获取大小、取首尾元素” 的接口:
|
函数声明 |
接口说明 |
|---|---|
|
empty |
检测list是否为空,是返回true,否则返回false |
|
size |
返回list中有效节点的个数 |
|
front |
返回list的第一个节点中的值的引用 |
|
back |
返回list的最后一个节点中的值的引用 |
注意:front() 和 back() 仅在 list 非空时使用,若为空会触发未定义行为(建议先 empty() 判断)
更多推荐

所有评论(0)