C++高级学习:第九节-list容器(上)

  [微信公众号:Cpp入门到精通]有完整六十六节知识,STL知识总结,欢迎关注学习!!

  list是一个STL中的双向链表容器。它是一个线性容器,允许在两端(头部和尾部)高效地插入和删除元素,而不需要移动其他元素。那么它和我们之前讲到的deque容器有什么区别呢?


list容器和deque容器的比较:

数据结构:list 使用双向链表实现,每个元素都包含一个指向前一个元素和后一个元素的指针。而deque 使用双端队列实现,它通常由多个块组成,每个块内部是一个固定大小的数组。

随机访问:list不提供随机访问,因为链表不是用连续线性空间存储数据的,必须沿着链表从头或尾遍历来访问元素。而deque提供随机访问,因为每个块内的元素是通过索引直接访问的。

插入删除操作:list在任意位置插入和删除元素的时间复杂度是O(1)。适用于频繁的插入和删除操作。而在两端(头和尾)插入和删除元素的时间复杂度是O(1),在中间的操作可能涉及多个块的移动,不如list容器高效。

空间大小:由于list容器每个元素都有额外的指针开销,可能导致更高的空间使用。

了解了list容器的一般特点以后,我们来介绍一下有关list容器的相关操作,其实容器之间的相关操作大差不差,只有一些细微的区别,是因为它们底层的数据结构不同。

1.包含头文件:


#include<list>

2.构造和赋值:


list<int>l1;//构造一个空链表
  list<int>l2(5, 10);//构造一个链表,内容为5个10
  list<int>l3(l2);//构造l3,将l2的内容赋值给l3

3.插入和删除元素:


list<int>l1;//构造一个空链表
  l1.push_back(10);//尾插
  l1.push_back(20);
  l1.push_back(30);
  l1.push_front(40);//头插
  l1.push_front(50);
  cout << "尾插,头插元素后:" << endl;
  print(l1);
  l1.pop_back();
  l1.pop_front();
  cout << "头删,尾删后:" << endl;
  print(l1);

结果如下:


尾插,头插元素后:
50 40 10 20 30
头删,尾删后:
40 10 20

在指定位置插入元素:


list<int>l1={10,20,30,40,50};
  print(l1);
  list<int>::iterator it=find(l1.begin(), l1.end(), 30);
  l1.insert(it, 66);
  print(l1);

在这里,我们使用迭代器在指定范围内找到目标元素,并将其位置的迭代器返回给it,如果找不到,就返回end()。l1.insert(it,66)即在it位置前插入66。

结果如下:


10 20 30 40 50
10 20 66 30 40 50

在指定位置删除元素:

list<int>l1={10,20,30,40,50};
  print(l1);
  list<int>::iterator it = find(l1.begin(), l1.end(), 30);
  l1.erase(it);
  print(l1);

使用迭代器返回20的位置的迭代器,使用l1.erase(30)可实现删除指定单个元素,也可以通过两个迭代器实现删除指定范围内的元素。


list<int>l1={10,20,30,40,50};
  print(l1);
  list<int>::iterator it = find(l1.begin(), l1.end(), 20);
  list<int>::iterator itend = find(l1.begin(), l1.end(), 40);
  if (it != l1.end() && itend != l1.end())
  {
    l1.erase(it, itend);
  }
  print(l1);

使用两个it选定第一个元素20,itend选定第二个元素40,l1.erase(it,itend)实现删除[20,40)之间的所有元素。


10 20 30 40 50
10 40 50

4.访问元素:

由于list的链表结构,所以并不支持随机访问。只能通过front()和back()访问首尾元素。


list<int>l1={10,20,30,40,50};
  print(l1);
  cout << "首元素为:" << l1.front() << endl;
  cout << "尾元素为:" << l1.back() << endl;

结果如下:

10 20 30 40 50
首元素为:10
尾元素为:50

5.反转容器:

在C++中,使用reverse()实现反转容器。


list<int>l1={10,20,30,40,50};
  print(l1);
  l1.reverse();
  print(l1);

结果如下:


10 20 30 40 50
50 40 30 20 10

list容器的基本操作先介绍到这里,下节我们继续讲其他操作,感谢观看!欢迎各位的点赞与关注!您的点赞和关注是我学习更新的动力!

  • 20
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值