7. list 双向链表
双向链表(list) 是链式存储的一种数据结构,其内部由双向链表实现。它的特点是在任意位置插入/删除快(O(1)),但不支持随机访问。
双向链表适用于需要频繁在中间插入/删除,且不需要随机访问的场景。
缺点:遍历较慢。
list 模板的定义方法如下:
template<
class T,
class Allocator = std::allocator<T>
> class list;
说明:
T是存储数据的类型。Allocator是内存分配器,用来自定义动态分配内存时使用,一般我们使用默认值。
list 创建的双向链表可以使用统一初始化列表 {...} 进行初始化。如:
std::list<int> vd = {1, 2, 3, 4};
常用的成员函数
成员函数
说明
list构造函数。
~list析构函数。
operator=赋值。
assign等同于
operator=。元素访问相关成员函数
front访问第一个元素
back访问最后一个元素
容量相关成员函数
empty判断是否为空
size返回数据元素个数
max_size返回可能存储的最大数据元素个数。
修改相关成员函数
clear清空数据。
insert插入数据
emplace(C++11)使用构造对象替换
erase删除数据
push_back向后追加单个数据
pop_back删除尾部单个数据
push_front在开始位置插入单个数据
pop_front删除第一个数据
resize修改数据元素个数量
swap交换两个容器内容
修改相关成员函数
merge合并两个有序链表
splice从另一个链表删除元素
remove/remove_if删除指定的数据
reserve反转数组顺序
unique删除重复数据
sort排序所有元素
迭代器相关成员函数
begin 或 cbegin(C++11)返回容器数据开始位置的迭代器
end或cend(C++11)返回容器数据结束位置的迭代器(最后一个元素的后面)
rbegin或crbegin(C++11)返回反向迭代器的起始位置(最后一个元素)
rend或 crend(C++11)返回反向迭代器的结束位置(第一个元素的前一位置)
以上函数只给出了函数名,以上函数大多数都有重载,具体请查看官方文档.
参考文档
https://en.cppreference.com/cpp/container/vector
非成员函数
操作
说明
operator==比较两个容器是否相同。
示例
// filename: mylist.cpp
#include <iostream>
#include <list>
int main(int argc, char * argv[]) {
// 创建一个存储整数的链表容器
std::list<int> l = {7, 5, 16, 8};
// 在前面插入一个整数。
l.push_front(25);
// 在末尾追加一个整数。
l.push_back(13);
// 打印链表信息:(C++98 的用法)
for (std::list<int>::const_iterator it = l.cbegin(); it != l.cend(); it++)
std::cout << *it << " ";
std::cout << std::endl;
l.remove(16);
// 打印链表信息:(C++11 的用法)
for (auto it = l.cbegin(); it != l.cend(); it++)
std::cout << *it << " ";
std::cout << std::endl;
return 0;
}
编译和运行结果如下
weimz@mzstudio:~$ g++ -o mylist mylist.cpp
weimz@mzstudio:~$ ./mylist
25 7 5 16 8 13
25 7 5 8 13