C++学习:STL-迭代器

迭代器是比容器更高一级的抽象。

迭代器是一种类型,在程序中使用的是其对象。
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;
}

猜你喜欢

转载自blog.csdn.net/pengchengliu/article/details/80525154