STL之list容器

list的介绍

1.list的底层是双向链表结构,双向链表中的每个元素在互不相关的独立结点中,在结点中通过指针指向前一个元素和后一个元素

2.list是可以在常数范围内在任意位置的插入和删除的序列式容器,并且该容器可以前后双向迭代

3.vector的优点:支持随机访问,间接的就支持了排序/二分查找/堆排序等

               缺点:1.头部和中部的插入效率低,需要挪动数据

                          2.插入数据空间不够需要增容,增容需要开新空间,拷贝数据,释放旧空间

    list的优点:没有增容代价,且任意位置插入都是0(1);

              缺点:不支持随机访问,得从头开始遍历查找到后面的元素

所以list和vector是互补的存在

注意:forward_list是单向链表

list的常见函数接口

构造函数:

 

与vector类似

第一个构造空的,第二个构造4个结点,每个都是100,第四个拷贝构造函数

第三个不用记,直接使用第四个去拷贝就行

Capacity接口 :

根据前面的vector和string的学习,相信大家都很熟悉了

empty():判断是否为空

size():返回结点数

相比之下,list没有capacity(),因为它是来一个结点就开一个

 Modifiers接口:

push_front():头插

pop_front():头删 

push_back():尾插

pop_back():尾删

insert():在pos位置插入val

erase():删除pos位置的元素

swap():交换两个list中的元素

clear():清空元素,clear 会遍历链表,为每个节点调用析构函数,并释放节点所占用的内存。

resize():在这里不常用,与之前容器的resize一样

Element access接口:

返回头部和尾部元素

operations接口

splice():转移链表 

sort():排序

reverse():逆置链表

iterator接口:

重点谈迭代器

从支持操作接口的角度分迭代器类型

单向(forward_list)   双向(list)  随机(vector)

it只能++                  it能++--             it能++--也能it+=5,直接跳几个

从使用场景的角度分迭代器类型

(正向迭代器+反向迭代器)+(const修饰迭代器+普通迭代器) 

迭代器失效:

可简单的将迭代器理解成指针(后面会有讲解迭代器如何实现),迭代器失效即迭代器所指向的结点无效,即该结点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除结点的迭代器,其他迭代器不会受影响

int array[]={1,2,3,4,5};
list<int> li(array,array+sizeof(array)/sizeof(array[0));
auto it=li.begin();
while(it!=li.end())
{
   it=li.erase(it);
  it++;
}

每次删除都会导致迭代器失效(vector里面我已经详细说明)所以每次删除返回迭代器都要更新it

 简单模拟实现list

June: 这里包含我的c++和Linux及数据结构https://gitee.com/taifanshu/day2.git注意:这里面要深刻体会const迭代器的实现,如何使用模板实现传参

 


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值