STL容器lists使用

来源:互联网 发布:mac 便签固定在桌面 编辑:程序博客网 时间:2024/05/16 08:25

STL容器lists使用

简介

list使用双向链表来管理元素。

list内部结构与vector和deque截然不同,主要体现在以下几个主要方面,其区别如下:

lists不支持随机存取。如果要读取某个元素,需要从头顺序遍历元素,找到对应位置,然后进行读取。
任何位置上(不只是两端)执行元素的安插和一尺都非常快,始终都是常数时间内完成,因为无需移动任何其它元素。实际上内部只是进行一些指针操作。
安插和删除动作并不会造成指向其他元素的各个pointers、references、iterators失效。
list对于异常处理方式是:要么操作成功,要么什么都不发生。决不会出现“只成功一般”的情况。
list并未提供容量、空间重新分配等操作,因为全无必要。每个元素都有自己的内存,在被删除之前一直有效。
lists提供了不少特殊的成员函数,专门用于移动元素。较之同名的STL通用算法,这些函数执行起来更快,因为它们无需拷贝或移动,只需调整若干指针即可。

list基本操作

  • 构造和析构操作

list c:产生一个空的list
list c1(c2):产生一个与c2同型的list(每个元素都被复制)
list c(n):产生拥有n个元素的list,这些元素都以default构造函数初始化
list c(n, elem):产生拥有n个元素的list,每个元素都是elem的副本
list c(beg, end):产生一个list并以[begin; end]区间内的元素为初值
c.~list():销毁所有元素,释放内存

  • 非变动性操作

c.size():返回元素个数
c.empty():判断容器大小是否为零。等同于size()==0,但可能更快
c.max_size():返回元素的最大可能数量
c1 == c2:判断是否c1等于c2
c1 != c2:判断是否c1不等于c2,等同于!(c1==c2)
c1 < c2:判断是否c1小于c2
c1 > c2:判断是否c1大于c2。等同于与c2 < c1相同
c1 <= c2:判断是否c1小于等于c2。等同于!(c2 < c1)
c1 >= c2:判断是否c1大于等于c2。等同于!(c2 < c2)

  • 赋值操作

c1 = c2:将c2的全部元素赋值给c1
c.assign(n, elem):将elem的n个拷贝赋值给c
c.assign(beg, end):将区间[beg; end)的元素赋值给c
c1.swap(c2):将c1和c2的元素互换
swap(c1, c2):将c1和c2元素互换。此为全局函数

  • 元素存取操作

c.front():返回第一个元素。不检查元素存在与否
c.back():返回最后一个元素。不检查元素存在与否

  • 迭代器操作

c.begin():返回一个双向迭代器,指向第一个元素
c.end():返回一个双向迭代器,指向最后元素的下一个位置
c.rbegin():返回一个逆向迭代器,指向逆向迭代器的第一个元素
c.rend():返回一个逆向迭代器,指向逆向迭代的最后元素的下一位置

  • 插入和移除操作

c.insert(pos, elem):在迭代器pos所指位置上安插一个elem副本,并返回新元素的位置
c.insert(pos, n, elem):在迭代器pos所指位置上安插n个elem副本,无返回值
c.insert(pos, beg, end):在迭代器pos所指位置上安插[beg; end]区间内的所有元素的副本,无返回值
c.push_back(elem):在尾部追加一个elem副本
c.pop_back():移除最后一个元素(但不返回)
c.push_front(elem):在头部安插一个elem副本
c.pop_front():移除第一个元素(但不返回)
c.remove(val):移除所有值为val的元素
c.remove_if(op):移除所有“造成op(elem)结果为true”的元素
c.erase(pos):移除迭代器pos所指元素,返回下一元素位置
c.erase(beg, end):移除区间[beg; end]内的所有元素,返回下一个元素位置
c.resize(num):将元素容量变为num。如果size()变大,则以default构造函数构造所有新增元素
c.resize(num, elem):将元素容量变为num。如果size()变大,则以elem副本作为新增元素的初值
c.clear():移除全部元素,将整个容器清空

  • 特殊变动性操作

c.unique():如果存在若干相邻而数值相当的元素,就移除重复元素,只留下一个
c.unique(op):如果存在若干相邻元素,都是用op()的结果为true,则移除重复元素,只留下一个
c1.splice(pos, c2):将c2内的所有元素转移到c1之内,迭代器pos之前
c1.splice(pos, c2, c2pos):将c2内的cpos所指元素转移到c1内的pos所指位置上(c1和c2
可相同)
c1.splice(pos, c2, c2beg, c2end):将c2内的[c2beg; c2end]区间内所有元素转移到c1内的pos之前(c1和c2可相同)
c.sort():以operator<为准则,对所有元素排序
c.sort(op):以op()为准则,对所有元素排序
c1.merge(c2):假设c1和c2容器都包含已序(sorted)元素,将c2的全部元素转移到c1,并保证合并后的list仍为已序
c1.merge(c2, op):假设c1和c2容器都包含op()原则下的已序(sorted)元素,将c2的全部元素转移到c1,并保证合并后的list在op()原则下仍为已序
c.reverse():将所有元素反序

  • 异常处理

list对于异常安全性提供了最佳支持。所有操作为要么成功,要么无效。其异常提供的特殊保护具体如下:

push_back():如果不成功,就无任何作用
push_front():如果不成功,就无任何作用
insert():如果不成功,就无任何作用
pop_back():不抛出异常
pop_front():不抛出异常
erase():不排除异常
clear():不排除异常
resize():如果不成功,就无任何作用
remove():只要元素比较操作不抛出异常,就不抛出任何异常
remove_if():只要判断式predicate不抛出异常,它就不抛出异常
unique():只要元素比较操作不排除异常,它就不抛出异常
splice():不抛出异常
merge():只要元素比较时不抛出异常,它便保证“要么成功,要么无任何作用”
reverse():不抛出异常
swap():不抛出异常

**参考文献:**C++标准库,STL源码剖析

0 0
原创粉丝点击