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;
}


posted @ 2016-05-29 16:11  小怪兽&奥特曼  阅读(250)  评论(0编辑  收藏  举报