1、结构

  list使用一个double linked list(双向链表)来管理元素。

2、 list 能力

  list内部结构和vector或deque截然不同,所以与他们的区别:

  list不支持随机存取,需要存取某个元素,需要遍历之前所有的元素,是很缓慢的行为。

  任何位置上(不止是两端)安插和删除元素都非常快,始终都是在常数时间内完成,因为无需移动其他任何操作,实际上只进行了一些指针操作。

  安插和删除并不会造成指向其他元素的各个pointers、reference、iterators失效

  list是原子操作,要么成功,要么失败,不会说只执行一半。

  list不支持随机存取,不提供下标操作符和at()函数。

  list不提供容量,内存分配的操作函数,因为完全没必要,每个元素都有自己的内存空间,在删除之前一直有效。

  list提供专门的函数用于移动函数,这些函数执行效率高,无需元素的拷贝和移动,只需要调整若干指针。

3、操作函数

3.1 构造和析构

操作

效果

list<Elem> c

产生一个空的list

list<Elem> c1(c2)

产生一个c2同型的list,每个元素都被复制

list<Elem> c(n)

产生一个n个元素的list,每个元素都由default构造产生

list<Elem> c(n,elem)

产生一个n个元素的list,每个元素都是elem的副本

list<Elem> c (beg,end)

产生一个list以区间[beg,end)内所有元素作为初值

c.~list<Elem>()

销毁所有元素,释放内存

3.2 非变动性操作

操作

效果

c.size()

返回当前的元素数量

c.empty()

判断大小是否为零,等同于0 == size(),效率更高

c.max_size()

返回能容纳的元素最大数量

c1 == c2

判断c1是否等于c2

c1 != c2

判断c1是否不等于c2(等同于!(c1==c2))

c1 < c2

判断c1是否小于c2

c1 > c2

判断c1是否大于c2

c1 <= c2

判断c1是否小于等于c2(等同于!(c2<c1))

c1 >= c2

判断c1是否大于等于c2 (等同于!(c1<c2))

3.3 赋值

操作

效果

c1 = c2

将c2的元素全部赋值给c1

c.assign(n,elem)

将elem的n个副本拷贝给c

c.assign(beg,end)

创建一个list,区间[beg,end)内的所有元素作为初值

c1.swap(c2)

c1和c2元素互换

swap(c1,c2)

c1和c2元素互换,全局函数

3.3 元素存取

  list不支持随机存取,只有front()和back()能直接存取元素。

操作

效果

c.front()

返回第一个元素,不检查元素是否存在

c.back()

返回最后一个元素,不检查元素是否存在

3.4 迭代器相关函数

  list只有使用迭代器才能对元素进行存取,list不支持随机存取,所以这些迭代器是双向迭代器,凡是用到随机存取迭代器的算法都不能使用。

操作

效果

c.begin()

返回一个随机存取迭代器,指向第一个元素

c.end()

返回一个随机存取迭代器,指向最后一个元素的下一个位置

c.rbegin()

返回一个逆向迭代器,指向逆向迭代的第一个元素

c.rend()

返回一个逆向迭代器,指向逆向迭代的最后一个元素的下一个位置

3.5 元素的安插和移除

  list提供了deque的所有功能,还增加了remove()和remove_if()应用于list。

操作

效果

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 ()

移除所有元素,将整个容器清空

3.6 特殊变动性操作

操作

效果

c.unique()

如果存在若干相邻而数值相等的元素,移除重复元素,只留下一个

c.unique(op)

若存在若干相邻元素,都使op()为true,移除重复元素,只留下一个

c1.splice(pos,c2)

将所有c2元素移到c1容器pos迭代器之前

c1.splice(pos,c2,c2pos)

将c2 pos位置元素移到c1元素pos位置,c1和c2可以相同

c1.splice(pos,c2,c2beg,c2end)

将c2区间[c2beg,c2end)所有元素移到c1 pos位置之前,c1和c2可以相同

c.sort()

以operator < 为准,对所有元素排序

c.sort(op)

以op()为准,对c排序

c1.merge(c2)

假设c1和c2已序,将c2元素移动到c1,并保证合并后的list仍为已序

c1.merge(c2,op)

假设c1和c2都以op()为序,将c2移动到c1仍然以op()已序

c.reverse()

将所有元素反序

4、示例代码

 // cont/list1.cpp

    #include <iostream>
#include <list>
#include <algorithm>
using namespace std; void printLists (const list<int>& , const list<int>& )
{ cout << "list1: ";
copy (l1.begin(), l1.end(), ostream_iterator<int>(cout," "));
cout << endl << "list2: ";
copy (.begin(), .end(), ostream_iterator<int>(cout," "));
cout << endl << endl; } int main()
{ //create two empty lists
list<int> list1, list2; //fill both lists with elements
for (int i=; i<; ++i) {
list1.push_back(i);
list2.push_front(i);
}
printLists(list1, list2); //insert all elements of list1 before the first element with value 3 of list2
//-find() returns an iterator to the first element with value 3
list2.splice(find(list2.begin(),list2.end(), // destination position
),
list1); // source list
printLists(list1, list2); //move first element to the end
list2.splice(list2.end(), // destination position
list2, // source list
list2.begin()); // source position
printLists(list1, list2); //sort second list, assign to list1 and remove duplicates
list2.sort();
list1 = list2;
list2.unique();
printLists(list1, list2); //merge both sorted lists into the first list
list1.merge(list2);
printLists(list1, list2);
}

输出:

   list1:
list2: list1:
list2: list1:
list2: list1:
list2: list1:
list2:

【C++ STL】List的更多相关文章

  1. CSP 201612-3 权限查询 【模拟+STL】

    201612-3 试题名称: 权限查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权 ...

  2. Educational Codeforces Round 34 B. The Modcrab【模拟/STL】

    B. The Modcrab time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  3. (转)【C++ STL】细数C++ STL 的那些事 -- priority_queue(优先队列)

    装载自http://blog.csdn.net/tianshuai1111/article/details/7652553 一,概述 priority_queue是拥有权值观念的queue,它允许加入 ...

  4. 【C++ STL】Set和Multiset

    1.结构 set和multiset会根据特定的排序原则将元素排序.两者不同之处在于,multisets允许元素重复,而set不允许重复. 只要是assignable.copyable.comparab ...

  5. 【C++ STL】Map和Multimap

    1.结构 Map和multimap将key/value pair(键值/实值 队组)当作元素,进行管理.他们根据key的排序准则将元素排序.multimap允许重复元素,map不允许. 元素要求: k ...

  6. 【C++ STL】容器概要

    1.容器的共通能力 1.  所有的容器都是“value”语意,而不是“reference”语意.容器进行元素的安插操作时,内部实施的都是拷贝操作,置于容器内.因此STL容器的每个元素都必须能被拷贝.如 ...

  7. 【gcd+stl】UVa1642 Magical GCD

    Description 一个长度为n的数列,选一个连续子序列,使得子序列的公约数*长度最大,求这个最大值.n<=1e5. Solution 连续子序列一般都要用滑动窗口是吧(固定r,快速计算最优 ...

  8. 2017CCPC秦皇岛 C题Crusaders Quest&&ZOJ3983【模拟+STL】

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3983 题意: 给定9个血槽,有三种物品,每次可以把连续相同的物品抵消 ...

  9. 【C++ STL】Queue

    1.定义 class queue<>实作为一个queue(也成为FIFO,先进先出).可以使用push()将任意数量的元素置入queue中,也可以使用pop()将元素以其插入顺序从容器中移 ...

  10. 【C++ STL】Stack

    1.定义 class stack<> 实作出一个stack(也成为LIFO,后进先出),你可以使用push()将任意数量的元素置入stack中,也可以使用pop()将元素依次插入次序反序从 ...

随机推荐

  1. HDU 3062 Party(2-SAT模版题)

    Problem Description 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是 ...

  2. 数组的引用——用作形参&返回类型时

    一.数组的引用 切入:可以将一个变量定义成数组的引用(这个变量和数组的类型要相同) 形式: int odd[5] = {1, 3, 5, 7, 9}; int (&arr)[5] = odd; ...

  3. ACM 第八天

    数据结构和算法目录表 数据结构和算法目录表   C C++ Java 线性结构 1. 数组.单链表和双链表 2. Linux内核中双向链表的经典实现  数组.单链表和双链表  数组.单链表和双链表   ...

  4. lintcode-197-排列序号

    197-排列序号 给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号.其中,编号从1开始. 样例 例如,排列 [1,2,4] 是第 1 个排列. 思路 参考http://www ...

  5. lintcode-176-图中两个点之间的路线

    176-图中两个点之间的路线 给出一张有向图,设计一个算法判断两个点 s 与 t 之间是否存在路线. 样例 如下图: for s = B and t = E, return true for s = ...

  6. .net 内置对象之Session对象和Session的过期时间

    QQ:827969653 有需要的朋友可以下载Session类:SessionHelper类 http://technet.microsoft.com/zh-cn/library/system.web ...

  7. 3dContactPointAnnotationTool开发日志(二四)

      添加了清空2d接触点的按钮,将输出的2d接触点的单位变成了像素,原点在图像的左下角.   对于obj文件的适配更加多样化了.

  8. 3dContactPointAnnotationTool开发日志(十一)

      把image也做成panel的形式了,并且放进了scrollView里,真实地显示出图像:   其它两个scrollView的content也做成自适应大小了,就是添加一项content的heig ...

  9. 简介Kafka Streams

    本文从以下几个方面介绍Kafka Streams: 一. Kafka Streams 背景 二. Kafka Streams 架构 三. Kafka Streams 并行模型 四. Kafka Str ...

  10. 火狐浏览器(FireFox)安装Flash插件失败处理方法

    最近不知道怎么了,总是嫌弃IE,可能是被网络流量监测的网址给搞得了,弄了火狐浏览器,也安装了猎豹,这里不对浏览器做评价 好多朋友安装好火狐(FireFox)的时候发现之前不是有装IE的Flash播放插 ...