迭代器是一个“可以遍历STL容器内全部或部分元素”的对象,在操作上有点类似C语言中的指针,不同的是:迭代器是个所谓的“smart pointer”,具有遍历复杂数据结构的能力,根据不同的容器具有不同的操作行为。迭代器被分为不同的类型,如图1所示;其能力列表如图表1。
图1 迭代器类型
表1 迭代器能力
Input迭代器
input迭代器只能一次一个的向前读取元素,按此顺序一个个传回元素值。几乎所有的迭代器都具备input迭代器能力,而且能力更,纯粹的input迭代器的典型例子就是“从标准输入装置(键盘)读取数据”的迭代器。
/****************************************************************
*函数名称:IstreamExample
*功 能:input 迭代器示例
*作 者:Jin
*日 期:2016年5月27日
****************************************************************/
void IstreamExample()
{
std::cout << "********" << __FUNCTION__ << "********"<<std::endl;
istream_iterator<string> CinPos(cin);
unsigned usStrNum = 0;
const unsigned usMaxWords =2;
vector<string> strVector;
//input :vector list map deque string
//output:vector list
while (CinPos != istream_iterator<string>() )
{
if (usStrNum >= usMaxWords)
{
break;
}
else
{
//逐一获取缓冲区内容,直到遇到end of stream或跳出循环
strVector.push_back(*CinPos++);
usStrNum++;
}
}
//各元素以talbe键分隔
copy(strVector.begin(), strVector.end(), ostream_iterator<string>(cout, "\t"));
cout << endl;
}
Output迭代器
output迭代器和input迭代器相反,其作用是将元素值一个个写入,纯粹Output迭代器的一个典型例子就是“将元素写到标准输出装置(屏幕或打印机)”。另外一个典型例子就是“inserters”,它的作用是将元素值插入容器到容器内。
/****************************************************
*函数名称:OstreamExample
*功 能:output迭代器的用法
*作 者:Jin
*日 期:2016年5月22日
****************************************************/
void OstreamExample()
{
std::cout << "********" << __FUNCTION__ << "********"<<std::endl;
//产生ostream迭代器,指向标准输出(屏幕)
ostream_iterator<int> IntWriter(cout, " \n");
*IntWriter = 42;//屏幕打印42并换行
IntWriter++;
*IntWriter = 77;//屏幕打印77并换行
IntWriter++;
*IntWriter = -5;//屏幕打印-5 并换行
IntWriter++;
vector<int> IntVector;
for (int i = 0;i < 10; ++i)
{
IntVector.push_back(i);
}
//各元素以talbe键分隔
copy(IntVector.begin(), IntVector.end(), ostream_iterator<int>(cout, "\t"));
//各元素以<分隔
copy(IntVector.begin(), IntVector.end(), ostream_iterator<int>(cout, " < "));
cout << endl;
}
Forward迭代器
Forward迭代器是input迭代器和output迭代器的结合,具有input迭代器的全部功能和output迭代器的大部分功能。
Bidirectional 迭代器
bidirectional迭代器是在forward迭代器的基础上增加回头遍历的功能,它支持递减操作,比如map,set,list等。
--iter //步退 传回新位置
iter-- //步退 传回老位置
/****************************************************************
*函数名称:BidirectionalIter
*功 能:双向迭代器
*作 者:Jin
*日 期:2016年5月28日
****************************************************************/
void BidirectionalIter()
{
typedef map<string,int> StrIntMap;
StrIntMap StudentMap;
//insert student info
StudentMap.insert(make_pair("Andy", 1001));
StudentMap.insert(make_pair("Sun", 1002));
StudentMap.insert(make_pair("Jin", 1003));
StrIntMap::const_iterator pos = StudentMap.find("Sun");
//支持递减操作
pos--;
//output: name: Jin ID: 1003
cout << "name: " << pos->first << "ID: " << pos->second << endl;
}
Random Access 迭代器
随机迭代器是在双向迭代器的基础上再增加随机存取能力,它需要提供“迭代器算术操作”,包括相加+,相减-,小于< ,大于>,如表2所示。支持这些操作的容器有string,deque,vector。
下面给出的是代码示例
/****************************************************************
*函数名称:RandomAccessIter
*功 能:随机存功能示例
*作 者:Jin
*日 期:2016年5月28日
****************************************************************/
void RandomAccessIter()
{
typedef vector<int> IntVector;
IntVector coll;
const int nMaxNum = 10;
//0 1 2 3 4 5 6 7 8 9
for (int i = 0;i < nMaxNum; i++)
{
coll.push_back(i);
}
IntVector::iterator pos1 = coll.begin();
IntVector::iterator pos2 = coll.begin() + 2;
//pos1 pos2 等同于数组首地址
int temp1 = pos1[2];//temp1 = 2;
int temp2 = pos2[2];//temp2 = 4;
IntVector::iterator pos3 = pos1 + 2;//相对pos1向前跳跃2个元素
int temp3 = *pos3;//temp3 = 2;
//计算距离:10
cout<<"number/distance: " << coll.end() - coll.begin() << endl;
IntVector::iterator it = coll.begin();
//“<”仅是对随机迭代器有效,为了程序通用性,建议使用 !=
//输出:0 1 2 3 4 5 6 7 8 9
for (; it < coll.end();it++)
{
cout << *it << ' ';
}
cout << endl;
}