迭代器是指向容器中一个元素的类似指针的东西,通过它可以读取容器中的元素
容器可以进行++操作访问下一个元素
举例:
int main()
{
vector<int> a = {1,2,3};
vector<int>::iterator i = a.begin();
while(i != a.end()){
cout<< *i << " ";
i++;
}
}
begin()方法可以返回容器的第一个元素对应的迭代器
容器适配器是没有迭代器的 因为操作受限制,只能访问适配器的特定位置的元素(比如队列只能访问队列头)
迭代器的分类
- 正向迭代器:可以进行
++p
,p++
,*p
的操作。此外,两个正向迭代器可以互相赋值,还可以用==和!=运算符进行比较。但是不能进行大小比较。 - 反向迭代器:
容器类名::reverse_iterator 迭代器名;
和正向迭代器的操作逻辑相反。本质上和正向迭代器一样。 - 双向迭代器:也可以进行
--p
或p--
的操作 - 随机访问迭代器:可以进行
p+=i
p+i
p-=i
p-i
p[i]
的操作,也可以进行 <、>、<=、>= 的大小比较
当迭代器指向第一个元素前,或最后一个元素后,这时访问迭代器指向的元素,程序会崩溃。
不同类型迭代器的功能
容器 | 迭代器功能 |
---|---|
vector | 随机访问 |
deque | 随机访问 |
list | 双向 |
set / multiset | 双向 |
map / multimap | 双向 |
stack | 不支持迭代器 |
queue | 不支持迭代器 |
priority_queue | 不支持迭代器 |
迭代器的函数
- advance(p, n):使迭代器 p 向前或向后移动 n 个元素。
- distance(p, q):计算两个迭代器之间的距离,即迭代器 p 经过多少次 + + 操作后和迭代器 q 相等。如果调用时 p 已经指向 q 的后面,则这个函数会陷入死循环。
- iter_swap(p, q):用于交换两个迭代器 p、q 指向的值。