STL迭代器

一、 迭代器的分类
1.1 输入迭代器
输入迭代器主要用于为需要的数据源提供输入接口,该数据源可以是容器、数据流等。输入迭代器只能够从一个序列中读取数据,此类迭代器可以被修改和引用。只能一个一个读取,并且按此顺序传回元素值。最简单的例子就是从标准输入读取数据的迭代器,同一个值不会被读取两次,一旦从输入流中读取一个字后,下次读取时会读取另一个字。
1.2 输出迭代器
输出迭代器,主要用于输出程序中已经得到的数据结果,此处的容器包括容器、迭代器等,输出迭代器只能向一个序列中输出数据,此类迭代器可以被修改和引用。输出迭代器的作用就是将元素逐个写入,典型的例子就是将元素写入到标准输出装置的迭代器。
1.3 前向迭代器
前向迭代器可以随意访问序列中的元素,许多STL算法函数需要提供前向迭代器。前向迭代器可以读或者写,结合输入和输出迭代器的功能,并且能够保存迭代器的值,以便从原先的位置从新遍历。该迭代器是输出迭代器和输入迭代器的结合,多了一个功能是可以多次指向序列中的同一个元素,并且能多次处理同一个元素。
1.4 双向迭代器
双向迭代器既可以用来读,也可以用来写。双向迭代器也可以被增值而可以被减值,双向迭代器既可以向前也可以向后操作,所有的STL都提供了双向迭代器的功能,以利用数据的读入和写出。双向迭代器在前向迭代器的基础之上增加了回头遍历的功能,支持递减操作符。
1.5 随机访问迭代器
随机访问迭代器可以通过跳跃的方式访问容器中的任意数据,从而使数据访问非常灵活。随机访问迭代器作为功能强大的迭代器类型,具有双向迭代器的所有功能:
随机访问迭代器在双向迭代器的基础之上增加了随机存储的功能,可以运用“<”或者“>”等相互关系操作符的实现比较操作。
支持随机存取迭代器的对象或者数据类型:vector、deuqe、string和普通数组,map、set和list不支持。

二、 迭代器的关键属性:
1) 迭代器是指向序列元素的指针的概念。
2) 当前指向的元素,用“*”或者“->”表示。
3) 指向下一个元素,迭代器的增量用“++”。
4) 相等使用运算符“==”。
5) 只有随机存储迭代器可以通过加减整数取得相对地址。
6) 除了输出迭代器外,可以通过dietance()函数获取任意两个迭代器之间的距离。

三、 迭代器的层次结构。



四、 迭代器配接器。
迭代器配接器是预先定义的特殊迭代器,迭代器配接器使算法能够以逆向模式、安插模式进行,还可以和流配合。迭代器配接器不仅能起到辅助作用,还能赋予整个迭代器抽象概念更强大的能力。
4.1 逆向迭代器Reverse
重新定义了递增和递减运算,使其行为正好倒置,算法以逆序处理元素,所有的标准容器都允许用Reverse来处理元素。
一般用法的示例代码如下:

#include "stdafx.h"
#include "list"
#include "algorithm"
#include "iostream"
using namespace std;

void print(int& i)
{
 cout<<i<<" ";
}
int _tmain(int argc, _TCHAR* argv[])
{
 list<int> l1;
 for (int i=0;i<=9;i++)
  l1.push_back(i);
 for_each(l1.begin(),l1.end(),print);
 cout<<endl;
 for_each(l1.rbegin(),l1.rend(),print);
 cout<<endl;
 return 0;
}

同时,一般迭代器可以通过reverse_iterator转换成一个反向迭代器,示例代码如下:

#include "stdafx.h"
#include "list"
#include "algorithm"
#include "iostream"
using namespace std;

void print(int& i)
{
 cout<<i<<" ";
}
int _tmain(int argc, _TCHAR* argv[])
{
 list<int> l1;
 for (int i=0;i<=9;i++)
  l1.push_back(i);
 for_each(l1.begin(),l1.end(),print);
 cout<<endl;
 list<int>::iterator it;
 it=find(l1.begin(),l1.end(),5);
 cout<<"pos: "<<*it<<endl;
 list<int>::reverse_iterator itR(it);
 cout<<"rpos: "<<*itR<<endl;
 return 0;
}

逆向迭代器也可以通过base()转换成正向迭代器,示例代码如下:

#include "stdafx.h"
#include "list"
#include "algorithm"
#include "iostream"
using namespace std;

void print(int& i)
{
 cout<<i<<" ";
}
int _tmain(int argc, _TCHAR* argv[])
{
 list<int> l1;
 for (int i=0;i<=9;i++)
  l1.push_back(i);
 for_each(l1.begin(),l1.end(),print);
 cout<<endl;
 list<int>::iterator it;
 it=find(l1.begin(),l1.end(),5);
 cout<<"pos: "<<*it<<endl;
 list<int>::reverse_iterator itR(it);
 cout<<"rpos: "<<*itR<<endl;
 list<int>::iterator it1;
 it1=itR.base();
 cout<<"rpos: "<<*it1<<endl;
 return 0;
}

4.2 插入型迭代器Inserters
用来将赋值操作转换成插入新值的操作,实际上是调用容器的push_back()/push_front()/insert()进行插入,所以容器本身也必须支持上述函数。

后插入型back_inserter(容器名称),适用容器:vector/deque/list/string;
前插入型front_inserter(容器名称),适用容器:deque/list;
产生型插入inserter(容器名称,插入位置迭代器),使用与所有的标准容器。

示例代码如下:
#include "stdafx.h"
#include "iostream"
#include "algorithm"
#include "deque"
#include "iterator"
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
 int dim[]={1,2,3,4,5,6};
 deque<int> d1;
 cout<<"deque d1(1)"<<endl;
 copy(dim,dim+6,back_inserter(d1));
 copy(d1.begin(),d1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 cout<<"deque d1(2)"<<endl;
 front_inserter(d1)=11;
 front_inserter(d1)=22;
 copy(d1.begin(),d1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 cout<<"deque d1(3)"<<endl;
 copy(d1.begin(),d1.end(),front_inserter(d1));
 copy(d1.begin(),d1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 inserter(d1,d1.end())=33;
 inserter(d1,d1.end())=44;
 cout<<"deque d1(4)"<<endl;
 copy(d1.begin(),d1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 deque<int> d2;
 copy(d1.begin(),d1.end(),inserter(d2,d2.begin()));
 cout<<"deque d2(5)"<<endl;
 copy(d2.begin(),d2.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 return 0;
}

4.3 流迭代器
流迭代器将流看成算法的起点和终点,流迭代器是特殊用途的输入和输出迭代器,使程序能够管理与IO相关的数据。
Ostream迭代器:
原型:ostream_iterator<int>(ostream,delim),
定义:为ostream产生一个迭代器,各元素以delim为分隔符分开,可以将被赋予的值写入output_stream中,ostream迭代器将赋值操作转换为运算符operator<<,算法就可以使用一般的迭代器接口直接对stream执行操作。
示例代码:
#include "stdafx.h"
#include "iostream"
#include "iterator"
#include "algorithm"
#include "vector"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 int dim[]={1,2,3,4,5,6,7,8,9};
 vector<int> v1;
 ostream_iterator<int> iter(cout,"\n");
 v1.assign(dim,dim+9);
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout));
 cout<<endl;
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout,"<"));
 cout<<endl;
 string delim(", ");
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout,delim.c_str()));
 cout<<endl;
 *iter=22;
 iter++;
 *iter=33;
 iter++;
 *iter=44;
 return 0;
}
istream迭代器:
原型:istream_iterator<T>(istream)
定义:为istream迭代器产生一个迭代器(可能立刻读取一个元素)
原型:istream_iterator<T>()
定义:产生一个end-of-stream迭代器,作为流读取结束的标志。
示例代码:
#include "stdafx.h"
#include "iostream"
#include "vector"
#include "iterator"
#include "algorithm"
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
 vector<int> v1;
 istream_iterator<int> inputCin(cin);
 istream_iterator<int> IEof;
 while(inputCin!=IEof)
 {
  v1.push_back(*inputCin);
  ++inputCin;
 }
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout,", "));
 cout<<endl;
 return 0;
}

五、 迭代器辅助函数
5.1 advance()

原型:advance(迭代器,int)
定义:使所有类型的迭代器均可以方便的前进和后退(不利用advance()的话,只有随机存取迭代器支持随意前进和后退),将参数迭代器按照整形前进或者后退若干位置。
示例代码如下:
#include "stdafx.h"
#include "iostream"
#include "vector"
#include "algorithm"
#include "iterator"
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
 int dim[]={1,2,3,4,5,6,7,8,9};
 vector<int> v1;
 vector<int>::iterator it;
 v1.assign(dim,dim+9);
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 it=v1.begin();
 advance(it,5);
 cout<<"第?个?元a素?是?:"<<*it<<endl;
 advance(it,-3);
 cout<<"第?个?元a素?是?:"<<*it<<endl;
 return 0;
}

5.2 distance()

原型:distance(iterator first,iterator last)
定义:可以计算容器中两个迭代器之间的距离,注意last必须在first之后或等于first。
示例代码如下:
#include "stdafx.h"
#include "iostream"
#include "list"
#include "algorithm"
#include "iterator"
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
 int dim[]={1,2,3,4,5,6,7,8,9};
 list<int> l1;
 copy(dim,dim+9,back_inserter(l1));
 copy(l1.begin(),l1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 list<int>::iterator pos;
 pos=find(l1.begin(),l1.end(),5);
 cout<<"元a素?5的?索?引y是?"<<distance(l1.begin(),pos)<<endl;
 return 0;
}

5.3 iter_swap()

原型:iter_swap(iterator1 first,iterator2 second)
定义:交换first和second所指向元素的值,两个迭代器类型可以不同,但是所指向的元素必须是可以互相转换的类型。
示例代码如下:
#include "stdafx.h"
#include "iostream"
#include "vector"
#include "list"
#include "algorithm"
#include "iterator"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 int dim[]={1,2,3,4,5,6,7,8,9};
 double Vdim[]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9};
 vector<int> v1;
 list<int> l1;
 v1.assign(dim,dim+9);
 copy(Vdim,Vdim+9,back_inserter(l1));
 cout<<"vector v1:"<<endl;
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout,", "));
 cout<<endl;
 cout<<"list l1:"<<endl;
 copy(l1.begin(),l1.end(),ostream_iterator<int>(cout,", "));
 cout<<endl;
 list<int>::iterator it=l1.begin();
 advance(it,4);
 iter_swap(v1.begin()+2,it);
 cout<<"vector v1:"<<endl;
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout,", "));
 cout<<endl;
 cout<<"list l1:"<<endl;
 copy(l1.begin(),l1.end(),ostream_iterator<int>(cout,", "));
 cout<<endl;
 return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值