C++ 双向迭代器
- 双向迭代器支持所有正向迭代器的功能,并且支持两个 递减运算符 (前缀和后缀)。
- 双向迭代器是用于在两个方向上访问元素的迭代器,即 向尾部和向头部 。
- 随机访问迭代器 也是有效的双向迭代器。
- 许多容器实现了双向迭代器,例如list、set、multiset、map、multimap。
- 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
双向迭代器的特点
- 相等/不相等运算符 :可以通过使用 相等 或 不相等运算符 来比较双向迭代器。只有当两个迭代器指向相同的位置时,它们才相等。
假设’A’和’B’是这两个迭代器:
A==B;
A!=B;
- 解引用: 双向迭代器可以同时解引用为 左值 和 右值 。
假设’A’是一个迭代器,’t’是一个整数变量:
*A = t;
t = *A
- Incrementable : 可以使用 operator++() 函数来递增一个双向迭代器。
A++;
++A;
- 可递减:双向迭代器也可以通过使用Operator –()函数来递减。
A--;
--A;
双向迭代器的限制
- 关系运算符 :双向迭代器可以使用相等或不相等运算符,但其他迭代器不能应用于双向迭代器。
假设’A’和’B’是两个迭代器:
A==B; // valid
A<=B; // invalid
- 算术运算符 :算术运算符不能与双向迭代器一起使用,因为它以顺序访问数据。
A+2; // invalid
A+1; // invalid
- 偏移引用运算符 :双向迭代器不支持偏移引用运算符或下标运算符[]用于随机访问元素。