C++ 标准库 <iterator>
C++ 标准库中的 <iterator> 头文件提供了一组工具,用于遍历容器中的元素。迭代器是 C++ 标准模板库(STL)中的核心概念之一,它允许程序员以统一的方式访问容器中的元素,而不需要关心容器的具体实现细节。
迭代器是一个对象,它提供了一种方法来遍历容器中的元素。迭代器可以被视为指向容器中元素的指针,但它比指针更加灵活和强大。迭代器可以用于访问、修改容器中的元素,并且可以与 STL 算法一起使用。
迭代器主要分为以下几类:
- 输入迭代器(Input Iterator):只能进行单次读取操作,不能进行写入操作。
- 输出迭代器(Output Iterator):只能进行单次写入操作,不能进行读取操作。
- 正向迭代器(Forward Iterator):可以进行读取和写入操作,并且可以向前移动。
- 双向迭代器(Bidirectional Iterator):除了可以进行正向迭代器的所有操作外,还可以向后移动。
- 随机访问迭代器(Random Access Iterator):除了可以进行双向迭代器的所有操作外,还可以进行随机访问,例如通过下标访问元素。
常用函数(重点)
| 函数 | 作用 | 示例 | 说明 |
|---|---|---|---|
std::advance(it, n) |
移动迭代器 n 步 | advance(it, 2); |
会修改原迭代器 |
std::distance(a, b) |
计算两个迭代器距离 | distance(v.begin(), v.end()); |
返回元素个数 |
std::next(it, n) |
返回向前 n 步的新迭代器 | auto it2 = next(it, 2); |
推荐,不修改原值 |
std::prev(it, n) |
返回向后 n 步的新迭代器 | auto it2 = prev(it, 1); |
C++11 起支持 |
迭代器适配器(非常重要)
迭代器适配器可以改变迭代器的行为,使其适配不同的使用场景。
| 适配器 | 作用 | 示例 |
|---|---|---|
std::back_inserter |
尾部插入(调用 push_back) | back_inserter(vec) |
std::front_inserter |
头部插入(调用 push_front) | front_inserter(list) |
std::inserter |
指定位置插入 | inserter(vec, it) |
流迭代器(IO 简化神器)
| 类型 | 作用 | 示例 |
|---|---|---|
std::istream_iterator |
从输入流读取数据 | istream_iterator<int>(cin) |
std::ostream_iterator |
写入输出流 | ostream_iterator<int>(cout, " ") |
迭代器的语法
迭代器的语法通常如下:
#include <iterator>
// 使用迭代器遍历容器
for (ContainerType::iterator it = container.begin(); it != container.end(); ++it) {
// 访问元素 *it
}
实例
下面是一个使用 <iterator> 头文件和迭代器遍历 std::vector 的示例:
实例
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main() {
// 创建一个 vector 容器并初始化
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用迭代器遍历 vector
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 使用 auto 关键字简化迭代器类型
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 使用 C++11 范围 for 循环
for (int elem : vec) {
std::cout << elem << " ";
}
std::cout << std::endl;
// 使用 back_inserter 自动插入
std::vector<int> v2;
std::fill_n(std::back_inserter(v2), 3, 100);
// 使用 ostream_iterator 输出
std::copy(v2.begin(), v2.end(),
std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}
#include <vector>
#include <iterator>
#include <algorithm>
int main() {
// 创建一个 vector 容器并初始化
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用迭代器遍历 vector
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 使用 auto 关键字简化迭代器类型
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 使用 C++11 范围 for 循环
for (int elem : vec) {
std::cout << elem << " ";
}
std::cout << std::endl;
// 使用 back_inserter 自动插入
std::vector<int> v2;
std::fill_n(std::back_inserter(v2), 3, 100);
// 使用 ostream_iterator 输出
std::copy(v2.begin(), v2.end(),
std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}
输出结果:
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 100 100 100
总结
<iterator> 的核心作用可以总结为三点:
- 统一访问方式:不同容器使用同一套遍历逻辑
- 解耦容器与算法:算法只依赖迭代器
- 提升代码复用性:同一段代码可适用于多种数据结构
对于初学者来说,建议优先掌握以下内容:
next / prev / distanceback_inserter- 迭代器遍历方式
