zoukankan      html  css  js  c++  java
  • 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, "	"));
    	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, " 
    ");
    
    	*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, "	"));
    	
    	//各元素以<分隔
    	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;
    }


  • 相关阅读:
    wpf随笔
    XGrid绑定(转)
    SQL Server 批量插入数据的两种方法(转)
    UdpClient的Connect究竟做了什么(转)
    InvokeHelper,让跨线程访问/修改主界面控件不再麻烦(转)
    [C#] Control.Invoke方法和跨线程访问控件
    多线程访问winform控件出现异常的解决方法
    http://www.jdon.com/mda/oo_relation.html
    三范式浅析(转)
    SQL 表锁(转)
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468413.html
Copyright © 2011-2022 走看看