容器类型上的操作形成了一种层次:
●某些操作是所有容器类型都提供的(参见表9.2,第295页)。
●另外一些操作仅针对顺序容器(参见表9.3,第299页)、关联容器(参见表11.7,第388页)或无序容器(参见表11.8,第395页)。
●还有一些操作只适用于一小部分容器。
一般来说,每个容器都定义在一个头文件中,文件名与类型名相同。即,deque定义在头文件deque中,list定义在头文件list中,以此类推。容器均定义为模板类(参见3.3节,第86页)。例如对vector,我们必须提供额外信息来生成特定的容器类型。对大多数,但不是所有容器,我们还需要额外提供元素类型信息:
list<Sales data>//保存Sales_data对象的巨st
deque<double>//保存double的deque
对容器可以保存的元素类型的限制
顺序容器几乎可以保存任意类型的元素。特别是,我们可以定义一个容器,其元素的类型是另一个容器。这种容器的定义与任何其他容器类型完全一样:在尖括号中指定元素类型(此种情况下,是另一种容器类型):
vector<vector<string>> lines; //vector的vector
此处lines是一个vector,其元素类型是string的vector。
注意:较旧的编译器可能需要在两个尖括号之间键入空格,例如,vector<vector<string> >。
虽然我们可以在容器中保存几乎任何类型,但某些容器操作对元素类型有其自己的特殊要求。我们可以为不支持特定操作需求的类型定义容器,但这种情况下就只能使用那些没有特殊要求的容器操作了。
例如,顺序容器构造函数的一个版本接受容器大小参数(参见3.3.1节,第88页),它使用了元素类型的默认构造函数。但某些类没有默认构造函数。我们可以定义一个保存这种类型对象的容器,但我们在构造这种容器时不能只传递给它一个元素数目参数:
//假定noDefault是一个没有默认构造函数的类型
vector<noDefault> v1(10, init);//正确:提供了元素初始化器
vector<noDefault> v2(10);//错误:必须提供一个元素初始化器
当后面介绍容器操作时,我们还会注意到每个容器操作对元素类型的其他限制。
表9.2:容器操作 | |
类型别名 | |
iterator | 此容器类型的迭代器类型 |
const_iterator | 可以读取元素,但不能修改元素的迭代器类型 |
size_type | 无符号整数类型,足够保存此种容器类型最大可能容器的大小 |
difference_type | 带符号整数类型,足够保存两个迭代器之间的距离 |
value_type | 元素类型 |
reference | 元素的左值类型:与value_type&含义相同 |
const_reference | 元素的const左值类型(即,constvalue_type&) |
构造函数 | |
Cc; | 默认构造函数,构造空容器(array,参见第301页) |
C c1{c2}; | 构造c2的拷贝c1 |
C c(b, e); | 构造C,将迭代器b和e指定的范围内的元素拷贝到c(array不支持) |
C c{a, b, c...}; | 列表初始化c |
const_reference | 元素的const左值类型(即,const value_type&) |
构造函数swap | |
c1 = c2 | 将cl中的元素替换为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() | 若c中存储了元素,返回false,否则返回true |
添加/删除元素(不适用于array) | |
注:在不同容器中,这些操作的接口都不同 | |
c.insert(args) | 将args中的元素拷贝进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 |
反向容器的额外成员(不支持forward_list) | |
reverse_iterator | 按逆序寻址元素的迭代器 |
const_reverse_iterator | 不能修改元素的逆序迭代器 |
c.rbegin(), c.rend() | 返回指向c的尾元素和首元素之前位置的迭代器 |
c.crbegin(), c.crend() | 返回const_reverse_iterator |
参考资料:
C++ Primer
标签:容器,const,迭代,元素,vector,概述,类型,93 From: https://www.cnblogs.com/codemagiciant/p/17390932.html