五种迭代器类型分别是什么?
参考回答
C++ STL 中的五种迭代器类型是:
- 输入迭代器(Input Iterator):
只允许从容器中读取元素,且只能向前移动一次。适用于只进行读取操作的场景。 -
输出迭代器(Output Iterator):
只允许向容器写入元素,且只能向前移动一次。适用于只进行写入操作的场景。 -
前向迭代器(Forward Iterator):
既可以读取元素,也可以写入元素。它支持多次向前移动,但不支持回退。适用于不需要回溯的场景。 -
双向迭代器(Bidirectional Iterator):
除了支持前向移动外,还可以回退到之前的位置。适用于需要双向遍历的场景。 -
随机访问迭代器(Random Access Iterator):
支持前向移动、回退,并且支持任意位置的跳跃(如+
、-
运算符)。它是最强大的迭代器,适用于vector
和deque
等支持随机访问的容器。
详细讲解与拓展
-
输入迭代器(Input Iterator):
- 输入迭代器只能进行读取操作,它只能向前遍历容器元素,并且每个元素只能被访问一次。这使得它在单次读取时非常高效。一个典型的例子是
istream_iterator
,它用于从流中读取数据。 - 示例:
std::istream_iterator<int> input_it(std::cin); std::istream_iterator<int> end_it; while (input_it != end_it) { std::cout << *input_it << " "; ++input_it; }
- 该代码片段会从标准输入读取整数并打印,直到输入结束。
- 输入迭代器只能进行读取操作,它只能向前遍历容器元素,并且每个元素只能被访问一次。这使得它在单次读取时非常高效。一个典型的例子是
- 输出迭代器(Output Iterator):
- 输出迭代器只能用于写操作,且只能将数据写入容器中。它也只能向前遍历一次,不支持回退或随机访问。一个常见的输出迭代器是
ostream_iterator
,用于将数据输出到流中。 - 示例:
std::ostream_iterator<int> output_it(std::cout, " "); *output_it = 10; // 将 10 输出到标准输出
- 输出迭代器只能用于写操作,且只能将数据写入容器中。它也只能向前遍历一次,不支持回退或随机访问。一个常见的输出迭代器是
- 前向迭代器(Forward Iterator):
- 前向迭代器不仅支持读取和写入操作,而且可以在容器中进行多次前向遍历。它适用于需要多次读取数据但不需要回溯的情况。
list
容器的迭代器就是前向迭代器。 - 示例:
std::list<int> lst = {1, 2, 3, 4, 5}; std::list<int>::iterator it = lst.begin(); while (it != lst.end()) { std::cout << *it << " "; ++it; }
- 前向迭代器不仅支持读取和写入操作,而且可以在容器中进行多次前向遍历。它适用于需要多次读取数据但不需要回溯的情况。
- 双向迭代器(Bidirectional Iterator):
- 双向迭代器除了支持前向遍历外,还支持后退操作。这使得它可以在容器中进行双向遍历。
list
和set
容器的迭代器就是双向迭代器。 - 示例:
std::list<int> lst = {1, 2, 3, 4, 5}; auto it = lst.begin(); ++it; // 向前移动 --it; // 向后移动
- 双向迭代器除了支持前向遍历外,还支持后退操作。这使得它可以在容器中进行双向遍历。
- 随机访问迭代器(Random Access Iterator):
- 随机访问迭代器是最强大的迭代器,支持前向、后退并且支持任意位置的跳跃操作(通过加减偏移量)。它们通常用于
vector
和deque
容器,因其支持常数时间的随机访问。 - 示例:
std::vector<int> vec = {1, 2, 3, 4, 5}; auto it = vec.begin(); std::cout << *(it + 2) << std::endl; // 输出 3
- 随机访问迭代器是最强大的迭代器,支持前向、后退并且支持任意位置的跳跃操作(通过加减偏移量)。它们通常用于
- 迭代器的继承关系:
C++ STL 中的迭代器是按照能力的强弱进行分类的。所有迭代器类型都从一个基础类Iterator
继承,并逐渐增加其能力:Input Iterator
是最基础的迭代器,支持输入操作。Output Iterator
支持输出操作。Forward Iterator
能多次向前遍历。Bidirectional Iterator
支持前进和回退操作。Random Access Iterator
是最强大的,支持任意的索引和移动。
- 常量迭代器:
还有一种与上述迭代器相关的类型叫做“常量迭代器(Const Iterator)”。它不允许通过迭代器修改容器中的元素,只能进行读取。这对于需要保护容器数据不被修改的场景非常有用。
总结来说,C++ STL 提供了不同类型的迭代器以适应不同的需求。从基础的输入输出操作到强大的随机访问,迭代器为我们提供了灵活且高效的容器操作方式。