迭代器
2023年12月23日 2023年12月26日
用来访问容器中的元素
解引用容器迭代器时, 会得到元素类型对象
不用像C语言需要自行遍历list的next和prev指针, 执行迭代器运算即可
所有容器都支持迭代器:
- 关联容器支持迭代器
- 不确定顺序容器支持随机访问还是顺序访问时,使用迭代器
可以获取所有容器的首前/尾后迭代器; 可以获取所有容器的首迭代器; 可以获取除forward_list外容器的尾迭代器
容器对迭代器运算的支持
递增递减运算符
- | |
---|---|
递增运算符 ++ |
按给定方向, 指向下一个元素 |
递减运算符 -- |
按给定方向, 指向上一个元素 |
-
顺序容器
所有迭代器都定义了递增运算符,从当前元素移动到下一个元素forward_list不支持递减运算符
-
关联容器
关联容器的迭代器都是双向的
访问容器中的元素
- | |
---|---|
解引用运算符 * |
获取元素的引用 |
成员访问运算符 -> |
访问元素的数据成员 |
迭代器范围
iterator range
给出两个迭代器, 通常指示一个左闭右开区间 [begin, end)
forward_list删除给定迭代器范围包含元素时, 迭代器范围指示开区间 (begin, end)
end迭代器指向容器中的元素或者尾后元素
在给定方向, begin迭代器在end迭代器之前: 可以通过递增begin去到end
常用指示
- | |
---|---|
begin == end | 判断容器是否为空 |
begin != end | 遍历元素时判断是否结束; 建议执行end操作 |
end - begin | 容器大小 |
1while (begin != end) 2{ 3 // process 4 ++begin; 5}
不是所有迭代器都定义了大于运算符, 小于运算符; 但所有迭代器都有定义不等运算符
反向迭代器
反向遍历容器元素的迭代器
获取迭代器: 使用begin和end操作获取指向首元素和尾后元素的迭代器
获取反向迭代器: 使用rbegin和rend操作获取指向尾元素和首前元素的反向迭代器
递增迭代器, 可以从首元素遍历到尾后元素; 递增反向迭代器, 可以用尾元素遍历到首前元素
forward_list不支持反向迭代器
获取迭代器
操作 | 常量版本: 指向元素的具有顶层const | |
---|---|---|
begin | 获取指向首元素的迭代器 | cbegin |
end | 获取指向尾后元素的迭代器 | cend |
rbegin | 获取指向尾元素的反向迭代器 | crbegin |
rend | 获取指向首前元素的反向迭代器 | crend |
- 首前元素和尾后元素并不存在, 用来指示位置: 一个在首元素之前, 一个在尾元素之后
- 不需要对元素执行写操作时, 建议使用获取迭代器操作的常量版本
1// 获取迭代器 2 3auto beg = c.begin(); // 获取迭代器,指向首元素 4auto end = c.end(); // 获取迭代器,指向尾后元素 5 6auto cbeg = c.cbegin(); 7auto cend = c.cend();
1// 获取反向迭代器. forward_list不支持 2 3auto rbeg = c.rbegin(); // 获取反向迭代器,指向尾元素 4auto rend = c.rend(); // 获取反向迭代器,指向首前元素 5 6auto crbeg = c.crbegin(); 7auto crend = c.crend();
1list<string> a = {"Milton", "Shakespeare", "Austen"}; 2 3list<string>::iterator it1 = a.begin(); // "Milton" 4 5list<string>::reverse_iterator it2 = a.rbegin(); // "Austen" 6 7list<string>::const_iterator it3 = a.cbegin(); // "Milton" 8 9list<string>::const_reverse_iterator it4 = a.crbegin(); // "Austen"