C++STL迭代器

自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 迭代器,共同定义出一个反向的迭代区间。

相关文章
相关标签/搜索