博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL迭代器类型介绍
阅读量:4342 次
发布时间:2019-06-07

本文共 3675 字,大约阅读时间需要 12 分钟。

迭代器是一个“可以遍历STL容器内全部或部分元素”的对象,在操作上有点类似C语言中的指针,不同的是:迭代器是个所谓的“smart pointer”,具有遍历复杂数据结构的能力,根据不同的容器具有不同的操作行为。迭代器被分为不同的类型,如图1所示;其能力列表如图表1。

图1 迭代器类型

表1 迭代器能力

Input迭代器

input迭代器只能一次一个的向前读取元素,按此顺序一个个传回元素值。几乎所有的迭代器都具备input迭代器能力,而且能力更,纯粹的input迭代器的典型例子就是“从标准输入装置(键盘)读取数据”的迭代器。
/*****************************************************************函数名称:IstreamExample*功    能:input 迭代器示例*作    者:Jin*日    期:2016年5月27日****************************************************************/void IstreamExample(){	std::cout << "********" << __FUNCTION__ << "********"<
CinPos(cin); unsigned usStrNum = 0; const unsigned usMaxWords =2; vector
strVector; //input :vector list map deque string //output:vector list while (CinPos != istream_iterator
() ) { if (usStrNum >= usMaxWords) { break; } else { //逐一获取缓冲区内容,直到遇到end of stream或跳出循环 strVector.push_back(*CinPos++); usStrNum++; } } //各元素以talbe键分隔 copy(strVector.begin(), strVector.end(), ostream_iterator
(cout, "\t")); cout << endl;}

Output迭代器

output迭代器和input迭代器相反,其作用是将元素值一个个写入,纯粹Output迭代器的一个典型例子就是“将元素写到标准输出装置(屏幕或打印机)”。另外一个典型例子就是“inserters”,它的作用是将元素值插入容器到容器内。
/*****************************************************函数名称:OstreamExample*功    能:output迭代器的用法*作    者:Jin*日    期:2016年5月22日****************************************************/void OstreamExample(){	std::cout << "********" << __FUNCTION__ << "********"<
IntWriter(cout, " \n"); *IntWriter = 42;//屏幕打印42并换行 IntWriter++; *IntWriter = 77;//屏幕打印77并换行 IntWriter++; *IntWriter = -5;//屏幕打印-5 并换行 IntWriter++; vector
IntVector; for (int i = 0;i < 10; ++i) { IntVector.push_back(i); } //各元素以talbe键分隔 copy(IntVector.begin(), IntVector.end(), ostream_iterator
(cout, "\t")); //各元素以
<分隔 copy(intvector.begin(), intvector.end(), ostream_iterator
(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
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
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;}

转载于:https://www.cnblogs.com/jinxiang1224/p/8468413.html

你可能感兴趣的文章
学习使用Django一 安装虚拟环境
查看>>
Hibernate视频学习笔记(8)Lazy策略
查看>>
CSS3 结构性伪类选择器(1)
查看>>
IOS 杂笔-14(被人遗忘的owner)
查看>>
自动测试用工具
查看>>
前端基础之BOM和DOM
查看>>
[T-ARA/筷子兄弟][Little Apple]
查看>>
编译Libgdiplus遇到的问题
查看>>
【NOIP 模拟赛】Evensgn 剪树枝 树形dp
查看>>
java学习笔记④MySql数据库--01/02 database table 数据的增删改
查看>>
两台电脑如何实现共享文件
查看>>
组合模式Composite
查看>>
程序员最想得到的十大证件,你最想得到哪个?
查看>>
我的第一篇CBBLOGS博客
查看>>
【MyBean调试笔记】接口的使用和清理
查看>>
07 js自定义函数
查看>>
jQueru中数据交换格式XML和JSON对比
查看>>
form表单序列化后的数据转json对象
查看>>
[PYTHON]一个简单的单元測试框架
查看>>
[BZOJ4303]数列
查看>>