9.2 容器库概览
容器类型上的操作形成了一种层次:
- 某些操作是所有容器类型都提供的
- 另外一些操作仅针对顺序容器、关联容器或无序容器
- 还有一些操作只适用于一小部分容器
容器操作
类型别名 |
- |
iterator |
此容器类型的迭代器类型 |
const_iterator |
可以读取元素,但是不能修改元素的迭代器类型 |
size_type |
无符号整数类型,足够保存此容器类型的最大可能容器大小 |
difference_type |
带符号整数类型,足够保存两个迭代器之间的距离 |
value_type |
元素类型 |
reference |
元素左值类型,与value_type&含义相同 |
const_reference |
元素的const左值类型 |
构造函数 |
- |
C c; |
默认构造函数,构造空容器 |
C c1(c2); |
构造c2的拷贝c1 |
C c(b,e); |
构造c,将迭代器b和e指定范围内的元素拷贝到c(array不支持) |
C c{a,b,c...}; |
列表初始化c |
赋值与swap |
- |
c1 = c2 |
将c1中元素替换成c2中元素 |
c1 = {a,b,c...} |
将c1中的元素替换为列表中的元素(array不支持) |
a.swap(b) |
交换a和b元素 |
swap(a,b) |
与上式等价 |
大小 |
- |
c.size() |
c中元素的数目(不支持forward_list) |
c.max_size() |
c可保存的最大元素数目 |
c.empty() |
若c储存了元素,返回false,否则返回true |
添加/删除元素(array不支持) |
不同容器中,这些操作的接口不同 |
c.insert(args) |
将argc中元素拷贝进c |
c.emplace(inits) |
使用inits构造c中一个元素 |
c.erase(args) |
删除args指定的元素 |
c.clear() |
删除c中所有元素,返回void |
关系运算符 |
- |
== , != |
所有容器都支持相等、不等运算 |
< , <= , > , >= |
关系运算符(无序关联容器不支持) |
获取迭代器 |
- |
c.begin() , c.end() |
返回指向c的首元素和尾元素之后位置的迭代器 |
c.cbegin() , c.cend() |
返回const_iterator |
反向容器的额外成员 |
- |
reverse_iterator |
按逆寻址元素的迭代器 |
const_reverse_iterator |
不饿修改元素的逆序迭代器 |
c.rbegin() , c.rend() |
返回指向c的尾元素和首元素之前位置的迭代器 |
c.crbegin() , c.crend() |
返回const_reverse_iterator |
容器库均定义为模板类。对大多数容器,还需要额外提供元素类型信息:
list<Sales_data> //保存Sales_data对象的list
deque<double> //保存double的deque
顺序容器几乎可以保存任意类型的元素。特别是,可以以定义一个容器,其元素的类型是另一个容器。
vector<vector<string>> lines; //vector的vector
此处lines是一个vector,其元素是string的vector。
虽然我们可以在容器操作中保存几乎任何类型,但某些容器操作对元素类型有其自己的特殊要求。可以为不支持特定操作需求的类型定义容器。
//假定noDefault是一个没有默认构造函数的类
vector<noDefault> v1(10,init); //正确:提供了元素初始化器
vector<noDefault> v2(10); //错误:必须提供一个元素初始化器