【C++ STL】List
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的更多相关文章
- CSP 201612-3 权限查询 【模拟+STL】
		
201612-3 试题名称: 权限查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权 ...
 - 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 ...
 - (转)【C++ STL】细数C++ STL 的那些事 -- priority_queue(优先队列)
		
装载自http://blog.csdn.net/tianshuai1111/article/details/7652553 一,概述 priority_queue是拥有权值观念的queue,它允许加入 ...
 - 【C++ STL】Set和Multiset
		
1.结构 set和multiset会根据特定的排序原则将元素排序.两者不同之处在于,multisets允许元素重复,而set不允许重复. 只要是assignable.copyable.comparab ...
 - 【C++ STL】Map和Multimap
		
1.结构 Map和multimap将key/value pair(键值/实值 队组)当作元素,进行管理.他们根据key的排序准则将元素排序.multimap允许重复元素,map不允许. 元素要求: k ...
 - 【C++ STL】容器概要
		
1.容器的共通能力 1. 所有的容器都是“value”语意,而不是“reference”语意.容器进行元素的安插操作时,内部实施的都是拷贝操作,置于容器内.因此STL容器的每个元素都必须能被拷贝.如 ...
 - 【gcd+stl】UVa1642 Magical GCD
		
Description 一个长度为n的数列,选一个连续子序列,使得子序列的公约数*长度最大,求这个最大值.n<=1e5. Solution 连续子序列一般都要用滑动窗口是吧(固定r,快速计算最优 ...
 - 2017CCPC秦皇岛 C题Crusaders Quest&&ZOJ3983【模拟+STL】
		
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3983 题意: 给定9个血槽,有三种物品,每次可以把连续相同的物品抵消 ...
 - 【C++ STL】Queue
		
1.定义 class queue<>实作为一个queue(也成为FIFO,先进先出).可以使用push()将任意数量的元素置入queue中,也可以使用pop()将元素以其插入顺序从容器中移 ...
 - 【C++ STL】Stack
		
1.定义 class stack<> 实作出一个stack(也成为LIFO,后进先出),你可以使用push()将任意数量的元素置入stack中,也可以使用pop()将元素依次插入次序反序从 ...
 
随机推荐
- Ubuntu下FileZilla的安装
			
FileZilla是一个免费而且开源的FTP客户端软件,共有两种版本:客户端版本.服务器版本.FileZilla有条理的界面和管理多站点的简化方式使得FileZilla Client成为一个方便高效的 ...
 - 深入了解View的绘制流程
			
1. ViewRoot ViewRoot是连接WindowManager与DecorView的纽带,View的整个绘制流程的三大步(measure.layout.draw)都是通过ViewRoot完 ...
 - 团队作业7——第二次项目冲刺(Beta版本)-第一篇
			
1.当天站立式会议照片: 2.工作分工: 团队成员 分工 郭达22120 项目整合,后台代码 刘德培44060 数据库模块后台连接 石浩洋22061 前台界面优化 曾繁钦22056 前台界面优化.测试 ...
 - LintCode-54.转换字符串到整数
			
转换字符串到整数 实现atoi这个函数,将一个字符串转换为整数.如果没有合法的整数,返回0.如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN( ...
 - WIN8/8.1/10进入BIOS方法图解
			
1.首先点击桌面左下角的"开始". 2.然后点击电源. 3.然后按住shift,同时点击"重启".于是进入这个画面: 4.然后点击"疑难解答" ...
 - 【week2】Scrum中的站立会议
			
Scrum站立会议 站立会议给我的第一印象就是站着开会,在经过我查阅资料之后,发现也是差不多的意思.学术一点的分析就是在Sprint开始后,团队将会在每个工作日特定时间举行一个简短会议,每次会议 ...
 - ZOJ 1229 M-Gift?!
			
https://vjudge.net/contest/67836#problem/M There is a beautiful river in a small village. N rocks ar ...
 - CCleaner专业版注册码
			
下载软件安装之后: 1.断网 2.用户名:任意,注册码:C2YW-XZT7-A4SE-UD89-YZPC
 - cacti 添加mysql 监控 (远程服务器)
			
监控主机 192.168.24.69 ,以下用A表示 被监控主机 192.168.24.79,以下用B标识 记得在A服务器的cacti中导入监控mysql的templates文件 1.在B上安 ...
 - [剑指Offer] 55.链表中环的入口结点
			
题目描述 一个链表中包含环,请找出该链表的环的入口结点. [思路]根据set集合的不重复,遍历链表时遇到的第一个重复结点就是环的入口结点. /* struct ListNode { int val; ...