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 关系运算符
- 所有容器都支持
=
和!=
- 除了无序容器,所有元素都支持
>
,<
,>=
,<=
- 比较两个容器时实际上是对容器内的元素进行逐对比较
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!