C++primer第九章P292学习笔记
1 顺序容器概述
什么是顺序容器?
容器(container)包括两种:顺序容器、关联式容器和无序容器(新增)。
下表列出了标准库(STL)中的顺序容器,所有顺序容器都提供了快速顺序访问元素的能力,但是顺序容器会在以下方面有不同的性能折中:
- 删除或添加元素的代价
- 非顺序(随机)访问元素的代价
容器 | 名称 | 支持的访问 | 增删 |
---|---|---|---|
vector | 可变大小数组 | 快速随机访问 | 在中间位置插入/删除元素很慢 |
string | 类似于保存字符的vector | 快速随机访问 | 在中间位置插入/删除元素很慢 |
list | 双向链表 | 双向顺序访问 | 在链表的任何位置插入或删除元素都很快 |
forward_list | 单向链表 | 单向顺序访问 | 在链表的任何位置插入或删除元素都很快 |
deque | 双端队列 | 快速随机访问 | 在头尾插入或删除元素很快 |
array | 固定大小数组 | 快速随机访问 | 不能添加或删除元素 |
- vector与string
string和vector都将元素保存在连续地内存空间中,因此随机访问速度很快,但是在中间位置增删元素时需要移动其他元素,导致速度很慢。 - list与forward_list
设计的目的是为了令容器的任何位置的增删操作都很快速,但是这两个容器不支持随机访问。 - deque
是一个更为复杂的数据结构。与string和vector类似,它支持快速的随机访问,在中间位置的增删也可能很慢,但是,deque在两端增删元素都是很快的,与list速度相当。
2 容器库概览
对于容器类的操作:
- 某些操作时所有容器类型都提供的,如下所示;
- 有些操作只针对顺序容器,有些只针对关联性容器、有些只针对无序容器;
- 还有一些操作只适用于小部分容器
/**
所有容器都支持的操作
**/
//类型别名
iterator 此容器类型的迭代器类型
const_iterator 可以读取元素,但不能修改元素的迭代器类型
size_type 无符号整型,足够保存此容器类型的最大可能大小
difference_type 有符号整型,足够保存两个迭代器之间的距离
value_type 元素类型
reference 元素的左值类型,与value_type&含义相同
const_reference 等价于const value_type&
//构造函数
C c; 默认构造函数,构造空容器
C c1(c2); 构造c2的拷贝c1
C c(b, e); 构造c,将迭代器b和e指定范围内的元素拷贝到c(array不支持)
C c(a,b,c...); 初始化c
//赋值与交换
c1 = c2 将c1中的元素替换为c2中的元素
c1 = {a,b,c...} 将c1的元素替换为列表中的元素,不适用于array
a.swap(b); 交换a与b的内容
swap(a,b) 与a.swap(b)等价
//大小
c.size() c中元素数目(不支持forward_list)
c.max_size() c中保存的最大元素数目
c.empty() 判断是否为空
//增加删除元素(不适用于array)
//注:在不同容器中,这些操作的函数都不同
c.insert(args) 将args中的内容插入c中
c.emplace(inits) 使用inits构造c中的一个元素
c.erase(args) 删除args中指定元素
c.clear() 清空所有元素
//关系运算符
==, != 所有容器都支持
<, <=, >, >= 无序容器不支持
//获取迭代器
c.begin(), c.end() 分别返回指向c的收元素和尾元素之后位置的迭代器
c.cbegin(), c.cend() 返回const_iterator
//反向容器的迭代器(不支持forward_list)
reverse_iterator 按逆序寻址的迭代器
const_reverse_iterator 不能修改元素的reverse_iterator
c.rbegin(), c.rend() 分别返回指向c的收元素和尾元素之后位置的反向迭代器
c.crbegin(), c.crend()