STL之容器:list

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类的成员函数:

1mylist.push_back(value)

在链表末尾插入一个元素。

2mylist.push_front(value)在链表头部插入一个元素。
3mylist.pop_back()删除链表末尾的元素。
4mylist.pop_front()删除链表头部的元素。
5mylist.back()返回链表末尾的元素。
6mylist.front()返回链表头部的元素。
7mylist.size()返回链表元素的数量。
8mylist.empty()判断链表是否为空,为空返回1,不为空返回0。
9mylist.clear()清空链表中的所有元素。
10mylist.begin()返回指向链表第一个元素的迭代器。
11mylist.end()返回指向链表最后一个元素的后面一个位置的迭代器。
12next(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yuga...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值