list是C++标准库提供的双向链表容器。与deque或vector不同,list的元素在内存中是以链表的形式存储的,每个元素都保留了指向前一个元素和后一个元素的指针。
由于list是使用链表实现的,因此插入和删除元素的性能非常高,尤其是在容器的头部和中间插入或删除元素时,时间复杂度仅为 O(1)。但是,与deque或vector相比,liat的随机访问效率较低,因为访问一个特定位置的元素需要沿着链表遍历。
一.使用前准备工作:
#include<list> //包含 <list> 头文件,以便在代码中使用 list 容器的功能。
using namespace std;
//命名空间声明,使得代码中的标识符不需要加上 std:: 前缀来使用 std 命名空间中的内容,包括 //std::list在内。
list<int> mylist;
//定义了一个名为 mylist 的变量,这行代码创建了一个空的list 对象,可以在后续的代码中添加、删除和访问元素。
mylist = {1, 2, 3, 4, 5}; //为链表添加元素,这里的12345是链表从头到尾每个结点所对应存储的数据
二.常用vector类的成员函数:
1 | mylist.push_back(value) | 在链表末尾插入一个元素。 |
2 | mylist.push_front(value) | 在链表头部插入一个元素。 |
3 | mylist.pop_back() | 删除链表末尾的元素。 |
4 | mylist.pop_front() | 删除链表头部的元素。 |
5 | mylist.back() | 返回链表末尾的元素。 |
6 | mylist.front() | 返回链表头部的元素。 |
7 | mylist.size() | 返回链表元素的数量。 |
8 | mylist.empty() | 判断链表是否为空,为空返回1,不为空返回0。 |
9 | mylist.clear() | 清空链表中的所有元素。 |
10 | mylist.begin() | 返回指向链表第一个元素的迭代器。 |
11 | mylist.end() | 返回指向链表最后一个元素的后面一个位置的迭代器。 |
12 | next(iterator,move) | next()接受两个参数,第一个参数是迭代器it ,第二个参数是指定要移动的距离n ,默认值为1。它返回一个新的迭代器,指向原迭代器移动n 个单位后的位置。 |
三.代码示例:
1.push_back()和push_front():
// 创建一个 dlist 对象并初始化
list<int> mylist = {1, 2, 3, 4, 5};
// 在链表头部插入一个元素。
mylist.push_front(7);
printf("mylist链表头部插入元素后的链表:\n");
for (int i = 0; i < mylist.size(); i++)
{
auto it = next(mylist.begin(), i);
printf("%d ", *it);
}
putchar('\n');
// 在链表尾部插入一个元素。
mylist.push_back(8);
printf("mylist链表尾部插入元素后的链表:\n");
for (int i = 0; i < mylist.size(); i++)
{
auto it = next(mylist.begin(), i);
printf("%d ", *it);
}
//输出:
mylist链表头部插入元素后的链表:
7 1 2 3 4 5
mylist链表尾部插入元素后的链表:
7 1 2 3 4 5 8
2.pop_front()和pop_back():
// 创建一个 dlist 对象并初始化
list<int> mylist = {1, 2, 3, 4, 5};
// 在链表头部插入一个元素。
mylist.pop_front();
printf("删除mylist链表头部元素后的链表:\n");
for (int i = 0; i < mylist.size(); i++)
{
auto it = next(mylist.begin(), i);
printf("%d ", *it);
}
putchar('\n');
// 在链表尾部插入一个元素。
mylist.pop_back();
printf("删除mylist链表尾部元素后的链表:\n");
for (int i = 0; i < mylist.size(); i++)
{
auto it = next(mylist.begin(), i);
printf("%d ", *it);
}
//输出:
删除mylist链表头部元素后的链表:
2 3 4 5
删除mylist链表尾部元素后的链表:
2 3 4
3.front()和back():
// 创建一个 dlist 对象并初始化
list<int> mylist = {1, 2, 3, 4, 5};
// 返回链表头部首元素。
int first_element = mylist.front();
printf("mylist链表头部元素为:%d\n", first_element);
// 返回链表尾部最后的元素。
int end_element = mylist.back();
printf("mylist链表尾部元素为:%d\n", end_element);
//输出:
mylist链表头部元素为:1
mylist链表尾部元素为:5
4.size()和empty()和clear():
// 创建一个 dlist 对象并初始化
list<int> mylist = {1, 2, 3, 4, 5};
// 返回链表元素个数。
int sum = mylist.size();
printf("mylist链表头部元素为:%d\n", sum);
// 判断是否为空
int result = mylist.empty();
if (result)
{
printf("链表为空!\n");
}
else
{
printf("链表不为空!\n");
}
//清空链表元素
mylist.clear();
// 判断执行clear后链表是否为空
int result2 = mylist.empty();
if (result2)
{
printf("clear后链表为空!\n");
}
else
{
printf("clear后链表不为空!\n");
}
//输出:
mylist链表头部元素为:5
链表不为空!
clear后链表为空!
5.begin()和end()和next():
// 创建一个 dlist 对象并初始化
list<int> mylist = {1, 2, 3, 4, 5};
// 返回指向链表第一个元素的迭代器。
auto first_it = mylist.begin();
printf("mylist链表头部元素为:%d\n", *first_it);
// 返回指向链表最后一个元素的后面一个位置的迭代器。
auto it = mylist.end();
//返回一个新的迭代器,指向原迭代器移动-1个单位后的位置,即指向链表最后一个元素。
auto end_it = next(it, -1);
printf("mylist链表尾部元素为:%d\n", *end_it);
//输出:
mylist链表头部元素为:1
mylist链表尾部元素为:5