引言
在C++中,std::list 是一个标准库提供的容器类,属于C++ STL(标准模板库)。std::list 是一种独特而强大的容器,它使用双向链表结构来管理元素。无论是在处理动态数据集合,还是在需要频繁进行插入和删除操作时,std::list 都展现了无与伦比的灵活性和效率。与其他线性数据结构如数组和向量相比,std::list 让开发者能够在不影响整体性能的情况下,轻松地在数据集中间添加或移除元素。
在这篇博客中,会以介绍与string类和vector类中相通的函数为主,在下一篇博客,探索C++的工具箱:双向链表容器类list(2)-优快云博客中,会以介绍string类 和vector类中没有的、list新引入的内容为主。
1. list 简介
C++ 的 std::list 是一个双向链表(doubly linked list)的实现,与 vector 不同,list 提供 O(1) 的插入和删除操作,但不支持随机访问。使用时需要包含头文件<list>。
如果将“list”比喻为一个“购物清单”,而“list中的元素”就相当于“购物清单上的每一项商品”。
在这个比喻中:
- 整个购物清单(list)是一个容器,帮助我们整理和管理购物的内容。
- 每一项商品(list中的元素)则是清单中具体要购买的内容。
就像我们可以在购物清单上添加、删除或修改商品,列表中的元素也可以随时增删改。
std::list具有以下特点:
-
双向链表:std::list 中的每个元素都包含指向前一个元素和后一个元素的指针。这使得在链表的任意位置进行插入和删除操作非常快速(时间复杂度为O(1)),但访问随机元素的效率较低(时间复杂度为O(n))。
-
动态大小:std::list 可以根据需要动态增长或收缩,能够有效管理动态变化的数据集。
-
不连续存储:与std::vector 不同,std::list 中的元素在内存中不必连续存储,这为插入和删除操作防止内存重排提供了便利。
-
支持迭代器:std::list 支持常规和反向迭代器,可以方便地遍历链表元素。
2.list的构造
基本语法:
default (1)
explicit list (const allocator_type& alloc = allocator_type());
fill (2)
explicit list (size_type n);
list (size_type n, const value_type& val,
const allocator_type& alloc = allocator_type());
range (3)
template <class InputIterator>
list (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
copy (4)
list (const list& x);
list (const list& x, const allocator_type& alloc);
move (5)
list (list&& x);
list (list&& x, const allocator_type& alloc);
initializer list (6)
list (initializer_list<value_type> il,
const allocator_type& alloc = allocator_type());
explicit 关键字用于构造函数,目的是为了防止类型转换(隐式转换)。如果一个构造函数被声明为 explicit,那么它只能通过显式的方式来调用,而不能用作隐式类型转换。
以下是构造和使用 std::list 的几种常见方法(默认使用std):
(1)默认构造函数
创建一个空的 std::list,可以使用以下代码: