C++ 双向迭代器

  • 双向迭代器支持所有前向迭代器的功能,并且还支持两个递减运算符(前缀和后缀)。
  • 双向迭代器用于在两个方向上访问元素,即向前和向后
  • 随机访问迭代器也是有效的双向迭代器。
  • 许多容器实现了双向迭代器,如list、set、multiset、map、multimap。
  • C++提供了两个非const迭代器,即迭代器和反向迭代器(reverse iterator),都可以在两个方向上移动。
  • C++的双向迭代器与前向迭代器具有相同的特性,唯一的区别在于双向迭代器还可以递减。

双向迭代器的特性

假设x和y是两个迭代器

特性表达式
双向迭代器是默认可构造、可复制和可析构的。A x; A y(x); y=x;
可以使用相等或不等运算符进行比较。x==y x!=y
可以通过使用解引用运算符(*)来获取值。*x
可以通过mutable迭代器作为lvalue进行解引用。*x = t
可以递增双向迭代器。x++ ++x
可以递减双向迭代器。x-- --x

在上表中,**'A'是双向迭代器类型,x和y是迭代器类型的对象,'t'是迭代器所指向的对象。

让我们看一个简单的例子:

#include <iostream>
#include <iterator>
#include <vector>
using namespace std;

int main()
{
    vector<int> v{1, 2, 3, 4, 5};  // vector声明
    vector<int>::iterator itr;    // 迭代器声明
    vector<int>::reverse_iterator ritr;  // 反向迭代器声明

    for (itr = v.begin(); itr != v.end(); itr++)
    {
        cout << *itr << " ";
    }
    cout << '\n';

    for (ritr = v.rbegin(); ritr != v.rend(); ritr++)
    {
        cout << *ritr << " ";
    }

    return 0;
}

输出:

1 2 3 4 5
5 4 3 2 1

双向迭代器的特性

1.png

  • 相等/不相等运算符:双向迭代器可以通过使用相等不等运算符进行比较。只有当两个迭代器指向相同的位置时,两个迭代器才相等。

假设'A'和'B'是两个迭代器:

A==B;
A!=B;
  • 解引用:双向迭代器也可以作为lvaluervalue进行解引用。

假设'A'是迭代器,'t'是整数变量:

*A = t;
t = *A;
  • 递增:双向迭代器可以通过使用运算符++()进行递增。
A++;
++A;
  • 递减:双向迭代器也可以通过使用运算符--()进行递减。
A--;
--A;

双向迭代器的限制:

  • 关系运算符:相等或不等运算符可以用于双向迭代器,但其他运算符不能用于双向迭代器。

假设'A'和'B'是两个迭代器:

A==B; // 有效
A<=B; // 无效
  • 算术运算符:不能使用算术运算符对双向迭代器进行操作,因为它们是按顺序访问数据的。
A+2; // 无效
A+1; // 无效
  • 偏移解引用运算符:双向迭代器不支持偏移解引用运算符或下标运算符[]以随机访问元素。

标签: C++语言, C++语言教程, C++语言技术, C++语言学习, C++语言学习教程, C++语言下载, C++语言开发, C++语言入门教程, C++语言进阶教程, C++语言高级教程, C++语言面试题, C++语言笔试题, C++语言编程思想