迭代器(Iterator) 是一种用于访问容器元素的对象,它是 C++ 标准库(STL)中非常重要的一个概念。可以将迭代器看作是容器的“指针”,用来逐一访问容器中的元素,而不需要直接使用下标。
迭代器的概念
迭代器提供了一种通用的方式来遍历容器中的元素,它允许你像指针一样移动,通过解引用(*
)操作来访问元素。迭代器可以用于几乎所有的 STL 容器,如 vector
、list
、deque
、map
、set
等。
迭代器的特点
-
像指针一样工作: 迭代器的行为与指针类似,你可以通过它来访问容器中的元素,使用
*
来获取当前元素,使用++
来移动到下一个元素。 -
统一的接口: 迭代器提供了统一的接口,可以通过相同的方式访问不同类型的容器(例如,
vector
、list
等),使得算法和容器的使用分离,从而增强了代码的通用性和可移植性。 -
容器独立性: 使用迭代器可以使代码更具容器独立性,避免直接依赖特定容器的内部实现。例如,通过迭代器遍历
vector
和list
的方法相同,而不需要关心它们的底层实现细节。 -
支持多种操作: 迭代器支持多种操作,如
++
(前进到下一个元素)、--
(向后移动)、*
(解引用获取元素值)等。
迭代器的种类
在 C++ 中,迭代器有几种不同的类型,具体类型取决于容器和迭代器的操作支持:
-
输入迭代器(Input Iterator): 用于读取容器中的元素。支持单向前进(
++
)和解引用(*
)。 -
输出迭代器(Output Iterator): 用于向容器中写入元素。
-
前向迭代器(Forward Iterator): 可以向前移动,支持读取和写入操作。
-
双向迭代器(Bidirectional Iterator): 除了支持前进(
++
)外,还支持向后移动(--
)。例如,list
容器的迭代器就是双向迭代器。 -
随机访问迭代器(Random Access Iterator): 支持通过下标(
[]
)访问元素,可以向前或向后移动,也可以直接跳跃一定距离。vector
和deque
支持这种类型的迭代器。
常见的迭代器操作
-
begin()
: 返回指向容器第一个元素的迭代器。 -
end()
: 返回指向容器最后一个元素之后位置的迭代器。 -
*it
: 解引用迭代器it
,返回当前元素的值。 -
++it
或it++
: 将迭代器it
前移到下一个元素。 -
it != container.end()
: 判断迭代器是否到达容器末尾,通常用在循环条件中。
迭代器示例
下面是一个使用迭代器遍历 vector
的简单示例:
#include <iostream>
#include <vector>
int main() {
// 创建一个 vector
std::vector<int> vec = {1, 2, 3, 4, 5};
// 创建一个迭代器,指向 vec 的第一个元素
std::vector<int>::iterator it = vec.begin();
// 使用迭代器遍历 vector
while (it != vec.end()) { // 当迭代器没有到达末尾
std::cout << *it << " "; // 输出当前元素
++it; // 移动到下一个元素
}
std::cout << std::endl;
// 也可以使用范围 for 循环
for (auto x : vec) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3 4 5
1 2 3 4 5
总结
- 迭代器 是一种通过统一接口访问容器元素的工具,它可以用于各种 STL 容器。
- 迭代器提供了类似指针的功能,可以用于遍历、访问、修改容器中的元素。
- 迭代器在 STL 算法中非常重要,因为它让算法与容器类型解耦,可以对不同类型的容器进行相同的操作。
总之,迭代器是 C++ 中一个非常强大且灵活的工具,它提供了简洁、高效的方式来访问和操作容器中的数据。