C++STL迭代器
自C++11起,我们就可以使用一个range-based for循环来处理所有的元素。这使人们意识到,我们需要一个”能够迭代某序列(sequence)内所有元素”的对象,这个对象就是迭代器,你也可以理解为,通过迭代器这个对象,可以表现出容器元素的位置。
迭代器的功能
1.指向容器中的元素,类似于指针。
2.作为容器与算法的媒介,也可以称作粘合剂。
迭代器的头文件
所有容器都定义有自己的iterator类型,在平时使用某种容器的iterator时,不必包含什么特殊的头文件。但一些特殊的iterator以及若干辅助的iterator函数,它们被定义于头文件<iterator>中,所以你要是想实现iterator的完整功能,必须要加上该头文件
#include<iterator>
迭代器的种类(按功能分类)
1.forward(前向) 迭代器
forward 迭代器使一种input 迭代器且再前进读取(reading forward)时提供额外保证。
允许操作
*iter //访问实际元素
iter->member //访问实际元素的成员member
++iter //向前步进(返回新位置)
iter++ //向前步进(返回旧位置)
iter1==iter2 //判断两个迭代器是否相等
iter1!=iter2 //判断两个迭代器是否不等
iter1=iter2 //对迭代器赋值
2.bidirectional(双向) 迭代器
bidirectional 迭代器在forward 迭代器的基础上增加了回头迭代的能力,它支持递减操作符,可一步一步的后退。
--iter //步退,返回新位置
iter-- //步退,返回旧位置
3.random-access(随机访问) 迭代器
random-access 迭代器在bidirectional 迭代器基础上增加了随机访问能力,有了一系列新增操作
iter[n] //访问索引位置为n的元素
iter+=n //前进n个元素
iter-=n //回退n个元素
iter+n //返回iter之后的第n个元素
n+iter //返回iter之后的第n个元素
iter-n //返回iter之前的第n个元素
iter1-iter2 //返回iter1和iter2之间的距离
iter1<iter2 //判断iter1是否在iter2之前
iter1>iter2 //判断iter1是否在iter2之后
iter1<=iter2 //判断iter1是否不在iter2之后
iter1>=iter2 //判断iter1是否不在iter2之前
迭代器按定义方式有以下4种
1.正向迭代器
容器类名::iterator 迭代器名;
2.反向迭代器
容器类名::reverse_iterator 迭代器名;
3.常量正向迭代器
容器类名::const_iterator 迭代器名;
4.常量反向迭代器
容器类名::const_reverse_iterator 迭代器名;
迭代器相关辅助函数
1.advance
advance()可将迭代器的位置增加,增加幅度由实参决定。
#include<iterator>
void advance(InputIterator& pos,Dist n)
令名称为pos的input迭代器前进(或后退)n个元素,Dist是个template类型,通常它必须是个整形。注意,该操作并不检查迭代器是否超过序列的end()。
该函数会根据迭代器种类采用最佳方案,最快为常量复杂度,最慢为线性复杂度。
使用实例
#include<iostream>
#include<list>
#include<iterator>
using namespace std;
int main()
{
list<int> c={1,2,3,4,5,6,7,8,9};
list<int>::iterator pos=c.begin();
cout<<*pos<<endl;
advance(pos,3);
cout<<*pos<<endl;
advance(pos,-1);
cout<<*pos<<endl;
return 0;
}
2.distance
distance()函数用来处理两个迭代器之间的距离。
#include<iterator>
Dist distance(InputIterator pos1, InputIterator pos2)
返回两个input迭代器pos1和pos2之间的距离。
注意:两个迭代器必须指向同一容器。且若不是random-access 迭代器,则从pos1开始必须要能达到pos2。返回类型是迭代器相应的类型。
该函数对于非随机访问迭代器效能并不是很好,应该避免使用。
使用实例
#include<iostream>
#include<list>
#include<iterator>
#include<algorithm>
using namespace std;
int main()
{
list<int> c={-3,-2,-1,0,1,2,3,4,5,6,7,8,9};
list<int>::iterator pos;
pos=find(c.begin(),c.end(),5);
if(pos!=c.end())
{
cout<<"distance between beginning and 5: "
<<distance(c.begin(), pos)<<endl;
}else
{
cout<<"5 not found"<<endl;
}
return 0;
}
find()后,数值为5的元素的位置被赋值给pos,然后distance()计算出pos与起点之间的距离。
3.iter_swap
一个简单的辅助函数,用来交换两个迭代器所指的元素值。
#include<algorithm>
void iter_swap(ForwardIterator1 pos1,ForwardIterator2 pos2)
迭代器的类型不必相同,但其所指的两个值必须可以相互赋值。
反向迭代器
严格的来说,反向迭代器是一种迭代器适配器,该特殊迭代器能让算法以反向模式进行操作。
所有标准容器都支持反向迭代器,你可以理解为,反向迭代器把正常迭代器的操作都颠倒过来了。
容器的成员函数rbegin()和rend()各返回一个reverse 迭代器,共同定义出一个反向的迭代区间。