迭代器是一个变量,可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。
迭代器类别
迭代器按照定义分为以下四种
- 正向迭代器
容器类名::iterator 迭代器名;
- 指向常量的正向迭代器
容器类名::const_iterator 迭代器名;
- 反向迭代器
容器类名::reverse_iterator 迭代器名;
- 指向常量的反向迭代器
容器类名::const_reverse_iterator 迭代器名;
*迭代器名
就表示迭代器指向的元素。通过非常量迭代器还能修改其指向的元素。
这里我从语言角度区分一下指向常量的迭代器const_iterator
和常量迭代器vector<int>::iterator const
,我们知道const
修饰的常量定义时必须初始化,所以下面的error就可以理解了
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v(10);
vector<int>::iterator it;
for(it = v.begin(); it != v.end(); it++)
{
*it = it - v.begin(); // 迭代器的解引用就像指针的解引用一样
}
vector<int>::const_iterator cit; // 指向常量的迭代器, cit本身可变, 但*cit不能变
for(cit = v.begin(); cit != v.end(); cit++)
{
cout << *cit << endl;
}
for(cit = v.begin(); cit != v.end(); cit++)
{
//*cit = 0; // error, const_iterator这种类型的迭代器指向的值是不可以更改的
}
vector<int>::iterator const xit; // error, const iterator自身不能改变, 所以必须对xit进行初始化
const vector<int>::iterator yit; // error, 同上
return 0;
}
C++迭代器:const_iterator和const形式的iterator有什么区别?
迭代器操作
迭代器都可以进行++
操作。反向迭代器和正向迭代器的区别在于:
- 对正向迭代器进行
++
操作时,迭代器会指向容器中的后一个元素; - 对反向迭代器进行
++
操作时,迭代器会指向容器中的前一个元素。
不同容器的迭代器功能强弱不同,分为输入、输出、正向、双向、随机访问五种
- 正向迭代器支持
++p p++ *p
,两个迭代器可以互相赋值,还可以用== !=
运算符比较 - 双向迭代器还支持
--p p--
-
- 支持的容器:
list set/multiset map/multimap
- 支持的容器:
- 随机访问迭代器还支持
p +=i p-=i p+i p-i p[i]
两个随机访问迭代器还可以用< > <= >=
-
- 支持的容器:
vector deque
- 支持的容器:
迭代器辅助函数
next
不改变当前迭代器,返回下一个迭代器prev
不改变当前迭代器,返回上一个迭代器advance(p,n)
迭代器p向前或向后移动n个元素distance(p,q)
计算两个迭代器的距离iter_swap(p, q)
用于交换两个迭代器指向的值,会改变容器的值。