9-2 容器库概述
目录
9.2.0 容器库的操作层次
容器库在操作上形成了一种层次
- 某些操作是所有容器类型都提供的((参见表9.2,第295页)。
- 另外一些操作仅针对顺序容器(参见表9.3,第299页)、关联容器(参见表11.7,第388页)或无序容器(参见表11.8,第395页)。
- 还有一些操作只适用于一小部分容器。
在本节,我们将介绍所有容器(顺序,关联,无序)都适用的操作,在本章的其他章节介绍顺序容器的其他操作,并在第11章介绍关联容器的操作


9.2.1 迭代器
迭代器支持的所有操作

迭代器支持的算术操作

迭代器范围
容器中有两个特殊的迭代器.begin()和.end()分别指向容器的第一个元素和容器的尾后元素
,二者构成了一个左闭右开区间
- 如果begin 与end相等,则范围为空
- 如果 begin 与 end不等,则范围至少包含一个元素,且 begin指向该范围中的第一个元素
- 我们可以对begin递增若干次,使得begin==end
9.2.2 容器类型成员
常见容器类型成员
| 类型成员 | 含义 |
|---|---|
| size_type | unsigned表示容器大小 |
| iterator | 迭代器 |
| const_iterator | 常量迭代器 |
| reverse_iterator | 反向迭代器 |
| value_type | 容器元素的类型 |
| reference | 元素类型的引用 |
| const_referance | 元素类型的常量引用 |
这些类型成员在泛型编程中很有用
在使用是必须显示标注其类名
//iter是通过list<string>定义的一个迭代器类型
list<string>::iterator iter;
//count是通过vector<int>定义的一个difference_type类型
vector<int>::difference_type count;
9.2.3 begin和end成员
常见用途是形成一个包含所有元素的迭代器范围
//常见的遍历容器的模板
for(auto it = v.begin(); it != v.end(); ++it){
cout<<*it<<endl;
}
auto 指定的类型是 vector
当不需要修改元素时,使用cbegin和cend
9.2.4 容器定义和初始化
容器的初始化

将一个容器初始化为另一个容器的拷贝
- 类型必须匹配: 容器类型; 容器元素类型
- 如果是用含迭代器的构造函数: 保证元素类型可以相互转换

列表初始化
显示地指出容器中包含哪些元素,同时指定了容器的大小
vector<int> = {1,2,3};
list<string> s = {"a", "b", "c"};
与顺序容器大小相关的构造函数

如果容器元素没有默认构造函数,那么必须显式地提供初始值
只有顺序容器的构造函数才接受大小参数, 关联容器不支持
9.2.5 赋值和swap
左右的容器的类型以及元素类型必须相同。

使用assign(仅顺序容器)
将参数所指定的元素替换掉左边容器中的元素

由于旧元素会被替换,所以传递给assign的迭代器不能指向调用assign的容器
assign 的第二个版本接受一个整型值和一个元素值。它用指定数目且具有相同给定值的元素替换容中原有的元素,

使用swap
交换两个相同类型容器的内容。
vector<string> svec1(10); //10个元素
vector<string> svec2(24); //24个元素
swap(svec1, svec2);
除了array外,swap对任何元素进行拷贝删除和插入,只是改变两个容器的内部结构,因此能在常数时间完成
除了string外,swap不会导致指向容器的迭代器、指针和引用失效。
9.2.6 容器大小操作
| 成员 | 含义 |
|---|---|
| size | 元素的数目 |
| empty() | 容器是否为空 |
| max_size | 返回一个>=该容器所能容纳的最大元素的值 |
9.2.7 关系运算符
- 所有容器都支持
=和!= - 除了无序容器,所有元素都支持
>,<,>=,<= - 比较两个容器时实际上是对容器内的元素进行逐对比较

浙公网安备 33010602011771号