一. 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() 判断)


 

更多推荐