引言
迭代器作为C++中新加的内容,在C++中起着十分大的作用,这篇文章将介绍迭代器的基本知识和基本使用
1.正向迭代器(iterator)
- 1.1 意义
迭代器是一种访问容器元素的通用接口,它的核心作用是遍历容器。你可以把它理解为“指向容器中某个元素的指针”,但比指针更抽象、更通用
- 1.2 用法
1.获取容器的起始位置
// 获取起始迭代器(指向第一个元素)
std::vector<int> vec = {10, 20, 30, 40, 50};
std::vector<int>::iterator it = vec.begin();
2.获取指向容器末尾的下一个位置
// 结束迭代器(指向末尾的下一个位置,无效,仅用于判断)
std::vector<int>::iterator end = vec.end();
至于为什么要指向末尾的下一个位置,那是为了遍历容器而做准备
3.解引用访问元素
// 解引用访问元素(类似指针)
std::cout << *it; // 输出 10
4.利用++和–找到上一个或下一个位置
// 自增移动到下一个元素
++it;
std::cout << *it; //输出 20
--it;
std::cout << *it; //输出10
5.遍历容器
// 遍历容器(最经典的写法)
for (it = vec.begin(); it != vec.end(); ++it)
{
std::cout << *it << " ";
}
- 1.3 特点
对于所有的容器都可以用类似的方式去使用对应的迭代器
2.反向迭代器(reverse_iterator)
- 2.1 意义
用来反向遍历容器,与正向迭代器反过来
- 2.2 用法
用法与正向迭代器基本相同,只是反过来了而已,这里给出反向遍历的例子:
std::vector<int> vec = {10, 20, 30, 40, 50};
std::vector<int>::iterator it = vec.rbegin();
for(: it != vec.rend(); it++)
{
cout << *it << " ";
}
cout << endl;
3.const迭代器
- 3.1 意义
明确表达”只读遍历”的意图,防止意外修改
- 3.2 用法
这里给出一个const迭代器遍历的例子:
std::vector<int> vec = {10, 20, 30, 40, 50};
// ========== 1. 基本遍历 ==========
std::cout << "【1. 基本遍历】\n";
for (std::vector<int>::const_iterator it = vec.begin();
it != vec.end(); ++it) {
std::cout << *it << " "; // 只读访问
// *it = 100; // ❌ 编译错误:不能修改
}
4.auto类型
- 4.1 意义
可以自动识别对应的类型
- 4.2 用法
我们可以发现,在之前的迭代器写法中,迭代器的类型要写很长一段,十分的冗余,因此我们可以采用auto类型来减少代码长度,提升效率的同时还不易出错
//例如对于const迭代器,我们可以这样写
vector<int> v1 = {1, 2, 3, 4, 5};
auto it = v1.cbegin();
5.范围for
- 5.1 意义
核心意义在于简化迭代器操作、减少错误、提升代码可读性,在低错误的情况下更好的遍历容器
- 5.2 用法
for (auto e : v) {
cout << e; // 直接是元素,不会解引用错
}
- 5.3 内核
范围for的内核就是利用迭代器进行遍历容器,只要容器存在迭代器就可以使用范围for,就算是自定义容器也是一样的道理
- 5.4 特点
1. 自动赋值
2.自动迭代
3.自动判断遍历结束
4.正常使用范围for是拷贝,想要修改内容要加上引用&,如下:
for (auto& e : v) {
cout << e;
e = 1; // 直接是元素,不会解引用错
}
这样就可以将v中的所有元素修改为1
总结
迭代器是C++中不可或缺的一部分,在之后的学习中我们还要学会自己写自定义类型的迭代器去使用,因此在这里打下基础是十分重要的

评论(0)
暂无评论