【STL-list】

一、list简介

1、为什么会有list?

作为补充vector缺点而存在。vector是顺序表(一个可动态增长的数组),list是带头双向循环链表。list和vector的区别实际上就是顺序表和链表的区别。
vectro缺点:
(1)头部和中部的插入删除效率低,o(N),需要挪动数据。
(2)插入数据空间不够需要增容,增容需要开新空间、拷贝数据再释放旧空间,会付出很大的代价。
vector的优点:
(1)支持下标随机访问,间接支持排序、二分查找,堆算法等等。

2、list优缺点:

优点:
(1)list头部、中间插入不再需要挪动数据,效率高。
(2)list插入数据是新增节点,不需要增容
缺点:
不支持随机访问,没有[]的随机访问,只能从头到尾遍历。

实际上vector和list是相辅相成的两个容器

3、list的基本介绍

1、list可以在常数范围内的任何位置插入或删除数据,并且可以双向迭代
2、list底层是双向链表
在这里插入图片描述

3、list和foward_list基本相似,但是forward_list是单链表,只能朝前迭代。
-forward_list:
forward_list是一个单向链表,只支持单向顺序访问,在链表的任何位置进行插入/删除操作都非常快。
在这里插入图片描述

二、list的基本使用

1、构造函数

在这里插入图片描述
(1)无参构造:list()
(2)用n个val值进行构造:list(size_type n,const value_type & val=val_type() )
(3)拷贝构造:list(const list& x);
(4)用first和last区间的元素进行构造:(包前不包后):list(inputiterator first,inputiterator last)

2、list的迭代器iterator的使用
在这里插入图片描述

(1)返回第一个元素:begin()
(2)返回最后一个元素的下一个位置:end()

  • begin()和end(),进行++操作,迭代器向后移动
    (3)返回反向迭代器的第一个元素(就是end位置):rbegin()
    (4)返回反向迭代器的最后一个位置的下一个位置(begin的前一个位置):rend
    -rbegin()、rend(),执行++操作**,迭代器向前移动**
    (5)c++11:cbegin()、cend()、crbegin()、crend()

3、容量操作
在这里插入图片描述

(1)判断list是否为空:bool empty()const
(2)返回list中有效结点个数:size_t size()

4、插入删除操作

(1)头插/尾插和头删/尾删
void push_front(const value_type& val)
void pop_front()
void push_back(const value_type& val)
void pop_back()

在这里插入图片描述在这里插入图片描述

(2)(自定义类型,在结点里构造对象)头插、尾插
在这里插入图片描述在这里插入图片描述

  • push_back和emplace_back的区别:
    push_back先构造好一个Date对象,然后再将Date对象拷贝到链表结点中,插入时先调构造函数,再调拷贝构造。 emplace_back:先构造结点,然后再调用构造函数在节点中直接构造对象

(3)插入和删除
插入
iterator insert(iterator position,const value_type&val);
在pos位置插入val,返回一个迭代器
void insert(iterator position,iterator first,iterator last);
将[first,last]区间的元素插入pos位置
void insert(iterator position,size_type n,const value_type& val)
在pos位置插入n个val
删除
iterator erase(iterator pos)
删除pos位置的元素,返回下一个位置的迭代器
iterator erase(iterator first ,iterator last)
删除[first,last]区间中的元素
在这里插入图片描述在这里插入图片描述
(4)clear/swap/resize
void swap(list& x)
交换两个容器的内容
void resize(size_type n,value_type val=value_type())
将list中有效元素个数变为n个,多出的元素用val填补(如果是自定义类型,就调用全缺省构造)
void clear()
清空list中的有效元素
在这里插入图片描述在这里插入图片描述

(5)迭代器失效问题
list的迭代器只有在erase的时候才会失效,insert的时候不失效(因为不会扩容,只需要插入一个结点即可)
在这里插入图片描述

三、list和vector的对比
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值