C++ Iterators

17 Mar 2025 | 5 分钟阅读

迭代器就像指针一样,用于访问容器元素。

重要提示

  • 迭代器用于从一个元素遍历到另一个元素,这个过程称为**遍历容器**。
  • 迭代器的主要优点是为所有容器类型提供一个通用接口。
  • 迭代器使**算法独立于**所使用的容器类型。
  • 迭代器提供了一种通用的方法来遍历容器中的元素。

语法

对迭代器执行的操作

  • 运算符 (*): '*' 运算符返回迭代器当前指向位置的元素。
  • 运算符 (++): '++' 运算符将迭代器递增一。因此,迭代器指向容器的下一个元素。
  • 运算符 (==) 和运算符 (!=): 这两个运算符都确定两个迭代器是否指向同一位置。
  • 运算符 (=): '=' 运算符赋值迭代器。

迭代器与指针的区别

迭代器可以是智能指针,允许迭代复杂的数据结构。容器提供其迭代器类型。因此,我们可以说迭代器与不同的容器类型具有相同的接口。

容器类提供了两个基本的成员函数,允许迭代或遍历容器中的元素

  • begin():begin() 函数返回一个指向容器第一个元素的迭代器。
  • end():end() 函数返回一个指向容器末尾(即最后一个元素之后)的迭代器。
C++ Iterators

让我们看一个简单的例子

输出

1 2 3 4 5

迭代器类别

迭代器可以按以下方式分类

  • 输入迭代器
  • 输出迭代器
  • 前向迭代器
  • 双向迭代器
  • 随机访问迭代器
C++ Iterators

输入迭代器: 输入迭代器是用于访问容器中元素的迭代器,但它不修改容器的值。

输入迭代器使用的运算符是

  • 增量运算符(++)
  • 相等运算符(==)
  • 不等运算符(!=)
  • 解引用运算符(*)

输出迭代器: 输出迭代器是用于修改容器值的迭代器,但它不从容器中读取值。因此,我们可以说输出迭代器是一个**只写迭代器**。

输出迭代器使用的运算符是

  • 增量运算符(++)
  • 赋值运算符(=)

前向迭代器: 前向迭代器是用于读写容器的迭代器。它是一个多趟迭代器。

前向迭代器使用的运算符是

  • 增量运算符(++)
  • 赋值运算符(=)
  • 相等运算符(=)
  • 不等运算符(!=)

双向迭代器: 双向迭代器支持前向迭代器的所有功能,并且它增加了一个功能,即递减运算符(--)。我们可以通过递减迭代器向后移动。

双向迭代器使用的运算符是

  • 增量运算符(++)
  • 赋值运算符(=)
  • 相等运算符(=)
  • 不等运算符(!=)
  • 递减运算符(--)

随机访问迭代器: 随机访问迭代器是提供对任意位置元素随机访问的迭代器。它具有双向迭代器的所有功能,并且它增加了一个功能,即指针加法和指针减法,以提供对元素的随机访问。

迭代器的提供者

迭代器类别Provider
输入迭代器istream
输出迭代器ostream
前向迭代器
双向迭代器List, set, multiset, map, multimap
随机访问迭代器Vector, deque, array

迭代器及其特性

Iterator访问方法移动方向I/O 能力
输入线性只能向前只读
输出线性只能向前只写
远期合约线性只能向前读/写
双向线性向前和向后读/写
随机随机向前和向后读/写

迭代器的缺点

  • 如果我们要同时从一个数据结构移动到另一个数据结构,迭代器将不起作用。
  • 如果我们要更新正在迭代的结构,迭代器不允许我们这样做,因为它们存储位置的方式。
  • 如果在遍历列表时需要回溯,迭代器在这种情况下将不起作用。

迭代器的优点

迭代器具有以下优点

  • 编程简便: 使用迭代器比使用下标运算符[]访问容器元素更方便。如果使用下标运算符[]访问元素,则需要跟踪运行时添加的元素数量,但使用迭代器则不会发生这种情况。

让我们看一个简单的例子

输出

      1 2 3 4 5                                                                                                          
      1 2 3 4 5                                                                                                          
      1 2 3 4 5 10                                                                                                       
      1 2 3 4 5 10 

在上面的示例中,我们观察到如果不用迭代器遍历向量元素,则需要跟踪容器中添加的元素数量。

  • 代码可重用性: 如果使用迭代器,则代码可以重用。在上面的示例中,如果我们将向量替换为列表,那么下标运算符[]将无法访问元素,因为列表不支持随机访问。但是,如果使用迭代器访问元素,那么也可以访问列表元素。
  • 动态处理: C++ 迭代器提供动态添加或删除数据的功能。

让我们看一个简单的例子

输出

1 10 2 3 4 5

在上面的示例中,我们使用 insert() 函数在第二个位置插入一个新元素,所有其他元素都向后移动一个位置。

随机访问迭代器与其他迭代器的区别

随机访问迭代器与其他迭代器最重要的区别是,**随机访问迭代器需要“1”步访问一个元素,而其他迭代器需要“n”步**。

C++ Iterators
下一主题C++ 教程