自C++11起,咱们就可使用一个range-based for循环来处理全部的元素。这令人们意识到,咱们须要一个”可以迭代某序列(sequence)内全部元素”的对象,这个对象就是迭代器,你也能够理解为,经过迭代器这个对象,能够表现出容器元素的位置。ios
迭代器的功能算法
1.指向容器中的元素,相似于指针。dom
2.做为容器与算法的媒介,也能够称做粘合剂。函数
迭代器的头文件spa
全部容器都定义有本身的iterator类型,在平时使用某种容器的iterator时,没必要包含什么特殊的头文件。但一些特殊的iterator以及若干辅助的iterator函数,它们被定义于头文件<iterator>中,因此你要是想实现iterator的完整功能,必需要加上该头文件指针
#include<iterator>
迭代器的种类(按功能分类)code
1.forward(前向) 迭代器对象
forward 迭代器使一种input 迭代器且再前进读取(reading forward)时提供额外保证。blog
容许操做索引
*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 迭代器,共同定义出一个反向的迭代区间。