STL迭代器类型介绍
迭代器是一个“可以遍历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; }