0Pricing
C++ Academy · 课时

迭代器类别:输入、前向、双向、随机访问

区分不同的迭代器类别,并选择适用的算法

迭代器类别:输入、前向、双向、随机访问 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

什么是迭代器

迭代器是一种广义指针。算法通过迭代器工作,从而与底层容器解耦。

五种迭代器类别

迭代器按照功能进行分类:

  • 输入——只读、单遍
  • 输出——只写、单遍
  • 前向——可读写、可多遍
  • 双向——可以向前和向后移动
  • 随机访问——可以按整数偏移量跳转

输入迭代器

读取一次、前进、重复。无法返回之前的位置。示例:std::istream_iterator。

std::istream_iterator<int> in(std::cin), end;
while (in != end) {
    std::cout << *in << " ";
    ++in;
}

输出迭代器

只能写入。示例:std::ostream_iterator 和 std::back_inserter。

std::ostream_iterator<int> out(std::cout, " ");
std::vector<int> v = {1, 2, 3};
std::copy(v.begin(), v.end(), out);

前向迭代器

类似于输入迭代器,但支持多遍访问——您可以从同一位置重新迭代。示例:std::forward_list。

双向迭代器

具备前向迭代器的功能,并额外支持 --。示例:std::list、std::map、std::set。

std::list<int> l = {1, 2, 3};
auto it = l.end();
--it;        // OK, points to last element

随机访问迭代器

在双向迭代器的基础上支持跳转:it + n、it - n、it[k]、it1 - it2。示例:std::vector、std::deque、原生数组。

算法要求

每个算法都会规定所需的最低迭代器类别。std::sort 要求随机访问迭代器;std::find 只要求输入迭代器。

迭代器特性

std::iterator_traits<Iter> 会在编译时公开迭代器的值类型、类别和其他属性。

using Category = std::iterator_traits<It>::iterator_category;
using Value = std::iterator_traits<It>::value_type;

std::advance 和 std::distance

以通用方式移动迭代器或测量距离。它们会根据迭代器类别选择最高效的实现。

auto it = v.begin();
std::advance(it, 5);              // efficient on random access, O(n) otherwise
auto d = std::distance(v.begin(), it);

自定义迭代器

要编写自己的迭代器,请为目标类别定义所需的类型别名和操作,例如 operator*、operator++、operator== 等。

C++20 迭代器概念

C++20 增加了正式的概念,例如 std::input_iterator、std::forward_iterator 和 std::random_access_iterator。它们取代了旧的基于标签的系统。

快速检查

哪个迭代器类别支持在常数时间内计算表达式 it + n?

总结

迭代器按照功能分为输入、输出、前向、双向和随机访问类别。算法会要求一个最低类别。向量容器的迭代器支持随机访问;列表和映射的迭代器支持双向访问。

常见问题解答

「迭代器类别:输入、前向、双向、随机访问」课时是免费的吗?

是的 — 「迭代器类别:输入、前向、双向、随机访问」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「迭代器类别:输入、前向、双向、随机访问」这节课中我会学到什么?

区分不同的迭代器类别,并选择适用的算法 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「迭代器类别:输入、前向、双向、随机访问」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 迭代器类别:输入、前向、双向、随机访问
  2. 常见迭代器模式:begin、end、advance
  3. C++20 范围库入门
  4. 范围适配器:views::filter、views::transform、views::take
← 返回 C++ Academy