菜鸟笔记
提升您的技术认知

C++ 双向迭代器

阅读 : 1368

双向迭代器支持正向迭代器的所有功能,并且还支持两个减量运算符(前缀和后缀)。
双向迭代器是用于在两个方向(即,朝向末端并朝向开始)访问元素的迭代器。
随机访问迭代器也是有效的双向迭代器。
许多容器实现双向迭代器,例如列表,集合,多集,地图,多图。
C++提供了两个在两个方向上都移动的非常量迭代器: 迭代器和反向迭代器。
C++双向迭代器具有与正向迭代器相同的功能,唯一的区别是双向迭代器也可以递减。

双向迭代器的属性

假设x和y是两个迭代器:

属性 表达
双向迭代器是默认可构造,可复制分配和可破坏的。 A x;
A y(x);
y = x;
可以使用相等或不相等运算符进行比较。 x == y
x!= y
可以取消引用,这意味着我们可以使用取消引用运算符(*)来检索值。 * x
可以将可变迭代器作为左值取消引用。 * 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 declaration
   vector<int> ::iterator itr;                        // iterator declaration
   vector<int> :: reverse_iterator ritr;         // reverse iterator declaration
   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

双向迭代器的功能

C++ 双向迭代器
等式/不等式运算符: 可以使用等式或不等式运算符比较双向迭代器。仅当两个迭代器都指向相同位置时,这两个迭代器才相等。 假设" A"和" B"是两个迭代器:

A==B;
A!=B;

取消引用: 双向迭代器也可以同时取消引用为 lvalue 和 rvalue 。 假设" A"是迭代器," t"是整数变量:

*A = t;
  t = *A

可递增: 可以使用 operator ++()函数来递增双向迭代器。

A++;
++A;

可递减: 也可以使用运算符-()函数来递减双向迭代器。

A--;
--A;

双向迭代器的局限性:

关系运算符: 相等或不相等运算符可以与双向迭代器一起使用,但是其他迭代器不能应用于双向迭代器。 假设" A"和" B"是两个迭代器:

A==B;           // valid
A<=B;           // invalid

算术运算符: 算术运算符不能与双向迭代器一起使用,因为它会顺序访问数据。

A+2;              // invalid
A+1;              // invalid

偏移量解引用运算符: 双向迭代器不支持偏移量解引用运算符或下标运算符[]用于元素的随机访问。