【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()将元素依次插入次序反序从 ...
随机推荐
- 关于ES6-{块级作用域 let const 解构赋值 数组 字符串 函数的扩展 箭头函数}
关于ES6 块级作用域 任何一对花括号({})中的语句集都属于一个块,在块中声明的变量在代码块外都是不可访问的,称之为块级作用域,ES5以前没有块级作用域 let let 是ES6新增的声明变量的一种 ...
- C语言--链表基础模板
1.建立结构体 struct ST { int num;///学号 int score;///成绩 struct ST*next; };///结构体 2.空链表的创建 struct ST creatN ...
- ACM 第五天
匈牙利算法(二分图匹配) C - Courses Consider a group of N students and P courses. Each student visits zero, one ...
- Python 零碎信息-基础 02
1. range xrange 的差别 1.1 range 返回列表对象. 1.2 xrange 返回xrange对象 不需要返回列表里面的值, 节省内存. >>> range(1 ...
- js设计模式之代理模式以及订阅发布模式
为啥将两种模式放在一起呢?因为这样文章比较长啊. 写博客的目的我觉得首要目的是整理自己的知识点,进而优化个人所得知识体系.知识成为个人的知识,就在于能够用自己的话表达同一种意义. 本文是设计模式系列文 ...
- Agile.Net 组件式开发平台 - 驱动开发示例
首先讲一下概念,此驱动非彼驱动.在Agle.Net中我们将组件规划成两种类型,一种是基于业务的窗体组件,一种是提供扩展功能的驱动组件. 打个比方例如一般系统中需要提供身份证读卡功能,然而市面上有很多种 ...
- [转]MATLAB cell数据类型
细胞型数据类型(cell)使不同类型和不同维数的数组可以共存,细胞型数组实际上可以认为是一种以任意形式的数组为分量的多维数组. 1.细胞型数据的定义 1)直接赋值定义:细胞型变量在定义时需要使用大括号 ...
- arc076 F - Exhausted? (霍尔定理学习)
题目链接 Problem Statement There are M chairs arranged in a line. The coordinate of the i-th chair ($$$1 ...
- bzoj1086-王室联邦
题目 给出一棵树,求一种分块方案,使得每个块的大小\(size\in [B,3B]\).每个块还要选一个省会,省会可以在块外,但是省会到块内任何一个点路径上的所有除了省会的点都必须属于这个块.\(n\ ...
- linux虚拟机磁盘扩展与分区大小调整
有段时间觉得linux虚拟机上的磁盘不太够用,研究了下其磁盘扩展 1.linux虚拟机磁盘扩展 step1. 先关机在编辑虚拟机中,找到硬盘选项增加空间,进行扩展step2. 进入root fdisk ...