目录
前言:什么是迭代器(Iterator)
1. 迭代器的作用
2. 迭代器的分类
2.1 输入迭代器(Input Iterator)
2.2 输出迭代器(Output Iterator)
2.3 前向迭代器(Forward Iterator)
2.4双向迭代器(Bidirectional Iterator)
3. 迭代器的基本用法
3.1 获取迭代器
3.2 遍历容器
3.3 反向迭代器
4. 迭代器适配器
4.1 插入迭代器
4.2 流迭代器
前言:什么是迭代器(Iterator)
迭代器是一种用于遍历容器(如数组、链表、集合等)的对象,类似于“指针”,但比指针更安全、功能更强。它主要用于 C++ STL(标准模板库) 以及其他支持迭代的编程环境。
1. 迭代器的作用
- 迭代器是 遍历容器的工具,类似指针,但更安全、更强大。
- 主要分为 输入、输出、前向、双向、随机访问 五种类型。
- 不同的容器 支持不同类型的迭代器(如
vector
支持随机访问,list
仅支持双向)。 - 常见用法:
begin()
/end()
获取迭代器。++it
/--it
移动迭代器。rbegin()
/rend()
反向遍历。std::back_inserter
/std::inserter
适配器用于插入。
2. 迭代器的分类
C++ STL 迭代器主要分为 五类,可以理解为“指针的不同级别:
2.1 输入迭代器(Input Iterator)
- 特点:只能从头到尾 单向读取 数据,不支持写入,也不能后退。
- 适用场景:适用于 只读 操作,比如从
cin
读取输入数据。
2.2 输出迭代器(Output Iterator)
- 特点:只能单向写入数据,不能读取,也不能后退。
- 适用场景:适用于 只写 操作,比如向
cout
输出数据,或者ofstream
写入文件。
2.3 前向迭代器(Forward Iterator)
- 特点:
- 既能 读取,也能 写入 数据。
- 只能前进,不能后退。
- 适用于链表(
forward_list
)。 - 代码示例:
std::forward_list<int> lst = {1, 2, 3};
std::forward_list<int>::iterator it = lst.begin();
std::cout << *it; // 输出 1
2.4双向迭代器(Bidirectional Iterator)
- 特点:
- 既能 读取,也能 写入 数据。
- 可以前进,也可以后退。
- 适用于 双向链表(
list
)和某些 STL 容器。
std::list<int> lst = {1, 2, 3};
std::list<int>::iterator it = lst.begin();
it++; // 前进
it--; // 后退
std::cout << *it;
2.5 随机访问迭代器(Random Access Iterator)
- 特点:
- 像指针一样可以随意访问 任意位置。
- 适用于 数组(
vector
)、deque
等 支持随机访问的数据结构。 - 可以使用
+
、-
、[]
操作符,如it + 2
直接跳过两个元素。
std::vector<int> vec = {10, 20, 30, 40};
std::vector<int>::iterator it = vec.begin();
std::cout << *(it + 2); // 访问 vec[2],输出 30
/*-------------------第二个例子-------------------------------------*/#include <iostream>
#include <vector>int main() {std::vector<int> vec = {100, 200, 300, 400, 500};std::vector<int>::iterator it = vec.begin();// 直接使用 [] 访问偏移位置std::cout << it[0] << std::endl; // 输出 100std::cout << it[2] << std::endl; // 输出 300std::cout << it[4] << std::endl; // 输出 500return 0;
}
3. 迭代器的基本用法
3.1 获取迭代器
C++ STL 提供了 begin()
和 end()
方法,分别返回指向容器 第一个元素 和 最后一个元素之后 的迭代
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int>::iterator it = vec.begin(); // 指向第一个元素
std::vector<int>::iterator endIt = vec.end(); // 指向超出最后一个元素的位置
注意:end()
不指向最后一个元素,而是最后一个元素的“下一个位置”。
3.2 遍历容器
使用迭代器遍历 vector
:
std::vector<int> vec = {10, 20, 30, 40};// 方式1:使用普通迭代器
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";
}// 方式2:使用 C++11 的 `auto`
for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";
}// 方式3:使用范围 `for` 循环(推荐)
for (int num : vec) {std::cout << num << " ";
}
3.3 反向迭代器
STL 容器提供 rbegin()
和 rend()
来支持 反向遍历:
std::vector<int> vec = {10, 20, 30, 40};
for (auto it = vec.rbegin(); it != vec.rend(); ++it) {std::cout << *it << " "; // 输出 40 30 20 10
}
4. 迭代器适配器
C++ STL 还提供了一些特殊迭代器,适用于不同需求:
4.1 插入迭代器
std::back_inserter(container)
: 在容器 末尾 插入元素(适用于vector
、list
)。std::front_inserter(container)
: 在容器 开头 插入元素(适用于deque
、list
)。std::inserter(container, it)
: 在 指定位置 插入元素。
std::vector<int> vec;
std::copy({1, 2, 3}, {4, 5, 6}, std::back_inserter(vec));
// vec 变为 {1, 2, 3, 4, 5, 6}
4.2 流迭代器
std::istream_iterator<T>(std::cin)
: 从输入流读取 数据。std::ostream_iterator<T>(std::cout)
: 向输出流写入 数据。
std::istream_iterator<int> in(std::cin), eof;
std::vector<int> vec(in, eof);