码迷,mamicode.com
首页 > 编程语言 > 详细

Part10 泛型程序设计与C++标准模板库 10.2迭代器

时间:2017-12-27 23:59:45      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:template   div   取数据   通过   函数的参数   last   style   ima   分类   

 

迭代器是算法和容器的桥梁
  迭代器用作访问容器中的元素
  算法不直接操作容器中的数据,而是通过迭代器间接操作
算法和容器独立
  增加新的算法,无需影响容器的实现
  增加新的容器,原有的算法也能适用

输入流迭代器和输出流迭代器
输入流迭代器
  istream_iterator<T>
  以输入流(如cin)为参数构造
  可用*(p++)获得下一个输入的元素
输出流迭代器
  ostream_iterator<T>
  构造时需要提供输出流(如cout)
  可用(*p++) = x将x输出到输出流

  二者都属于适配器
    适配器是用来为已有对象提供新的接口的对象
    输入流适配器和输出流适配器为流对象提供了迭代器的接口

//例10-2从标准输入读入几个实数,分别将它们的平方输出
#include<iterator>
#include<iostream>
#include<algorithm>
using namespace std;
double square(double x){
    return x*x;
}
int main(){
    transform(istream_iterator<double>(cin), istream_iterator<double>(), ostream_iterator<double>(cout,"\t"),square);
    cout << endl;
    return 0;
}

 

迭代器支持的操作
迭代器是泛化的指针,提供了类似指针的操作(诸如++、*、->运算符)
  输入迭代器
    可以用来从序列中读取数据,如输入流迭代器
  输出迭代器
    允许向序列中写入数据,如输出流迭代器
  前向迭代器
    既是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历
  双向迭代器
    与前向迭代器相似,但是在两个方向上都可以对数据遍历
  随机访问迭代器
    也是双向迭代器,但能够在序列中的任意两个位置之间进行跳转,如指针、使用vector的begin()、end()函数得到的迭代器

迭代器的分类

技术分享图片

 

 

迭代器的区间
  两个迭代器表示一个区间:[p1, p2)
  STL算法常以迭代器的区间作为输入,传递输入数据
  合法的区间
    p1经过n次(n > 0)自增(++)操作后满足p1 == p2
  区间包含p1,但不包含p2

迭代器的辅助函数
  advance(p, n)
    对p执行n次自增操作
  distance(first, last)
    计算两个迭代器first和last的距离,即对first执行多少次“++”操作后能够使得first == last

//例10-3 综合运用几种迭代器的示例
#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>
using namespace std;

//将来自输入迭代器的n个T类型的数值排序,将结果通过输出迭代器result输出
template<class T, class InputIterator, class OutputIterator>
void mySort(InputIterator first, InputIterator last, OutputIterator result){
    vector<T> s;
    for(;first != last; first++)
        s.push_back(*first);
    sort(s.begin(), s.end());        //对s进行排序,sort函数的参数必须是随机访问迭代器
    copy(s.begin(), s.end(), result);    //将s序列通过输出迭代器输出
}
int main(){
    //将s数组的内容排序后输出
    double a[5] = {1.2,2.4,0.8,3.3,3.2};
    mySort<double>(a,a+5,ostream_iterator<double>(cout," "));
    cout << endl;
    
    //从标准输入读入若干个整数,将排序后的结果输出
    mySort<int>(istream_iterator<int>(cin), istream_iterator<int>(), ostream_iterator<int>(cout," "));
    cout << endl;
    return 0;
}

 

Part10 泛型程序设计与C++标准模板库 10.2迭代器

标签:template   div   取数据   通过   函数的参数   last   style   ima   分类   

原文地址:https://www.cnblogs.com/leosirius/p/8127969.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!