C++STL迭代器

c/c++

浏览数:209

2019-6-8

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

作者:回首不知身是客