C++教程-C++双向迭代器
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
双向迭代器的特性
- 相等/不相等运算符:双向迭代器可以通过使用相等或不等运算符进行比较。只有当两个迭代器指向相同的位置时,两个迭代器才相等。
假设'A'和'B'是两个迭代器:
A==B;
A!=B;
- 解引用:双向迭代器也可以作为lvalue和rvalue进行解引用。
假设'A'是迭代器,'t'是整数变量:
*A = t;
t = *A;
- 递增:双向迭代器可以通过使用运算符++()进行递增。
A++;
++A;
- 递减:双向迭代器也可以通过使用运算符--()进行递减。
A--;
--A;
双向迭代器的限制:
- 关系运算符:相等或不等运算符可以用于双向迭代器,但其他运算符不能用于双向迭代器。
假设'A'和'B'是两个迭代器:
A==B; // 有效
A<=B; // 无效
- 算术运算符:不能使用算术运算符对双向迭代器进行操作,因为它们是按顺序访问数据的。
A+2; // 无效
A+1; // 无效
- 偏移解引用运算符:双向迭代器不支持偏移解引用运算符或下标运算符[]以随机访问元素。