学习笔记 c++ (迭代器)

迭代器

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

输入流迭代器和输出流迭代器

  • 输入流迭代器

    istream_iterator<T>
    
    • 以输入流(如cin)为参数构造
    • 可用*(p++)获得下一个输入的元素
  • 输出流迭代器

    ostream_iterator<T>
    
    • 构造时需要提供输出流(如cout)
    • 可用(*p++) = x将x输出到输出流
  • 二者都属于适配器

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

例:从标准输入读入几个实数,分别将它们的平方输出

//10_2.cpp
#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

例:综合运用几种迭代器的示例

程序涉及到输入迭代器、输出迭代器、随机访问迭代器这三个迭代器概念,并且以前两个概念为基础编写了一个通用算法。

//10_3.cpp
#include <algorithm>
#include <iterator>
#include <vector>
#include <iostream>
using namespace std;

//将来自输入迭代器的n个T类型的数值排序,将结果通过输出迭代器result输出
template <class T, class InputIterator, class OutputIterator>
void mySort(InputIterator first, InputIterator last, OutputIterator result) {
    //通过输入迭代器将输入数据存入向量容器s中
    vector<T> s;
    for (;first != last; ++first)
        s.push_back(*first);
    //对s进行排序,sort函数的参数必须是随机访问迭代器
    sort(s.begin(), s.end());  
    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;
    //从标准输入读入若干个整数,将排序后的结果输出,按Ctrl+d表示输入结束
    mySort<int>(istream_iterator<int>(cin), istream_iterator<int>(), ostream_iterator<int>(cout, " "));
    cout << endl;
    return 0;
}
/*
运行结果:
0.8 1.2 2.4 3.2 3.3
2 -4 5 8 -1 3 6 -5
-5 -4 -1 2 3 5 6 8
*/

迭代器的辅助函数

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

猜你喜欢

转载自blog.csdn.net/qq_42145185/article/details/82985046