STL详解(六) 双向链表容器list

一、List 容器简介

list是C++标准模版库(STL,Standard Template Library)中的部分内容。

list容器实质是一个双向链表,可以高效地进行插入删除元素。list不提供随机访问功能,也就是不能用下标和at()访问,当删除其中一个元素,指向其他元素的迭代器依然有效。对于任何位置的元素插入或移除,list永远是常数时间

List结构

list使用双向链表来管理元素,可以从两端发展新元素,其内部结构如下所示。

          

List能力


List的内部结构和vetor或deque截然不同,主要的区别入下:

  1. list不支持随机存取功能,可以支持首尾的直接存取,想获取其他元素,则需要遍历链表。
  2. 任何位置的删除、插入操作都非常快速,不需要移动和删除其他元素,这些操作在常数时间内完成。
  3. 安插和删除操作不会造成指向其他元素的各个pointer、reference、iterators失效
  4. list对异常操作的处理方式:要么成功,要么什么都不发生。

List所提供的成员函数区别:


list提供了不少特殊的成员函数,专门用于移动元素,和STL的通用算比较,这些成员函数的执行速度更快,主要是成员函数操作时,不需要移动元素或拷贝,仅需要调指针。
 

二、List 函数列表

构造函数
函数 功能
list<T> lstT list采用采用模板类实现,对象的默认构造形式
list(beg,end) 构造函数将[beg, end)区间中的元素拷贝给本身
list(n,elem) 构造函数将n个elem拷贝给本身
list(const list &lst) 拷贝构造函数

插入和删除
函数 功能
c.push_back(elem) 在容器尾部加入一个元素
c.pop_back() 删除容器中最后一个元素
c.push_front(elem) 在容器开头插入一个元素
c.pop_front() 从容器开头移除第一个元素
c.insert(pos,elem) 在pos位置插elem元素的拷贝,返回新数据的位置
c.insert(pos,n,elem) 在pos位置插入n个elem数据,无返回值
c.insert(pos,beg,end) 在pos位置插入[beg,end)区间的数据,无返回值
c.clear() 移除容器的所有数据
c.erase(beg,end) 删除[beg,end)区间的数据,返回下一个数据的位置
c.erase(pos) 删除pos位置的数据,返回下一个数据的位置
c.remove(elem) 删除容器中所有与elem值匹配的元素

大小操作
函数 功能
c.size() 返回容器中元素的个数
c.empty() 判断容器是否为空
resize(num) 重新指定容器的长度为num,变长则用默认值填充新位置;变短删除超出元素
resize(num, elem)

重新指定容器的长度为num,变长则用elem填充新位置;变短删除超出元素

c1 == c2 判断c1 是否等于c2
c1 != c2 判断c1是否不等于c2
c1 < c2 判断c1 是否小于c2
c1 > c2 判断c1 是否大于c2
c1 <= c2 判断c1是否小于等于c2
c1 >= c2 判断c1是否大于等于c2

赋值
函数 功能
c1 = c2 将c2的全部元素赋值给c1
c.assign(n, elem) 复制n个elem,复制给c
c.assign(beg, end) 将区间[beg;end)内的元素赋值给c
c1.swap(c2) 将c1和c2元素互换
swap(c1,c2) 同上,此为全局函数

List的特殊变动性操作
函数 功能
reverse() 反转链表:1,2,3,反转后为3,2,1
sort() sort为list的成员函数,而不是STL算法
c.sort(op) 以op()为准则,对所有元素排序
c.unique() 如果存在若干相邻而数值相等的元素,就移除重复元素,只留下一个
c.unique(op) 如果存在若干相邻元素,都使op()的结果为ture,则移除重复元素,只留下一个。
c1.splice(pos, c2) 将c2内的所有元素转移到c1之内,迭代器pos之前
c1.splice(pos, c2, c2pos) 将c2内的c2pos所指元素转移到c1之内的pos所指位置上(c1,c2可相同)
c1.splice(pos, c2, c2beg,c2end) 将c2内的[c2beg,c2end)区间内所有元素转移到c1内的pos之前(c1,c2可相同)
c1.merge(c2) 假设c1和c2容器都包含已序(相同的排序方式)元素,将c2的全部元素转移到c1,并保证合并后的list还是已序。
c1.merge(c2,op) 假设c1和c2容器都包含op()原则下的已序(相同的排序方式)元素,将c2的全部元素转移到c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值