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); //错误:必须提供一个元素初始化器