C++学习:STL-迭代器

  • Post author:
  • Post category:其他



迭代器是比容器更高一级的抽象。
迭代器是一种类型,在程序中使用的是其对象。
set<int>::iterator sit;                                           //set<int>::iterator是一个迭代器的类型。sit是一个迭代器的对象。

迭代器的概念



迭代器的类型
STL定义了5种迭代器,分别是:
随机访问迭代器(RandomAccessIterator)

//组合双向迭代器的功能与直接访问容器中任何元素的功能,即可向前向后跳过任意个元素
双向迭代器(BidirectionalIterator)

//组合正向迭代器和逆向迭代器的功能,支持多遍算法
前向迭代器(ForwardIterator)

//组合输入迭代器和输出迭代器的功能,并保留在容器中的位置
输出迭代器(OutputIterator)

//向容器中写入元素。输出迭代器只能一次一个元素向前移动。输出迭代器只支持一遍算


法,同一输出迭代器不能两次遍历一个序列
输入迭代器(InputIterator)

//从容器中读取元素。输入迭代器只能一次读入一个元素向前移动,输入迭代器只支持一遍算


法,同一个输入迭代器不能两遍遍历一个序列

迭代器的层次结构

上面这图表并不是表明它们之间的继承关系:而只是描述了迭代器的种类和接口。处于图表下层的迭代器都是相对于处于图表上层迭代器的扩张集。例如:forward迭代器不但拥有input和output迭代器的所有功能,还拥有更多的功能。

7种容器迭代器的具体类型

7种容器迭代器中,vector和deque是随机访问迭代器,其他5种均为双向迭代器。所以vector和deque支持at和operator[]运算。而其他的不支持(map虽然也可以,但不是真的支持,还是用的查找的原理)

流迭代器



输出流迭代器
#include <iostream>
#include <iterator>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
using std::ostream_iterator;
int main(void){
vector<int> vecInt = {1, 2, 3, 4, 5, 6};


//创建vector


ostream_iterator

<int> osi(cout, “,”);

//创建输出流迭代器对象osi。把cout看成一个容器。元素之间以逗号进行分隔。
copy(vecInt.begin(), vecInt.end(), osi);

//输出:1,2,3,4,5,6, copy算法,将vecInt.begin()到vecInt.end()的数据放到osi


开始的容器中。
cout << endl;
return 0;
}


输入流迭代器
#include <iostream>
#include <iterator>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::istream_iterator;
using std::vector;
int main(void){
vector<int> vecInt;

istream_iterator

<int> isi(cin);

//创建输入流迭代器isi
copy(isi, istream_iterator<int>(), vecInt.begin());

//错误。从isi开始copy,临时对象istream_iterator<int>()表示结束。放到


vecInt.begin()的地方。出错是由于直接vetInt里面没有空间就直接放了。
copy(isi, istream_iterator<int>(),

back_inserter(vecInt)

);

//从isi开始copy,临时对象istream_iterator<int>()表示结束。在vecInt尾部添


加数据。
for(auto & elem : vecInt)

//运行后,输入1 2 3 4 5 6 a 则输出:1 2 3 4 5 6
cout << elem << ” “;
cout << endl;
return 0;
}



版权声明:本文为pengchengliu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。