C++:迭代器

迭代器

  • 迭代器是算法和容器的桥梁

    • 迭代器用作访问容器中的元素

    • 算法不直接操作容器中的数据,而是通过迭代器间接操作

  • 算法和容器独立

    • 增加新的算法,无需影响容器的实现

    • 增加新的容器,原有的算法也能适用

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

  • 输入流迭代器
    • 以输入流(如cin)为参数构造

    • 可用*(p++)获得下一个输入的元素

istream_iterator<T>
  • 输出流迭代器
    • 构造时需要提供输出流(如cout)

    • 可用(*p++) = x将x输出到输出流

ostream_iterator<T>
  • 二者都属于适配器

    • 适配器是用来为已有对象提供新的接口的对象

    • 输入流适配器和输出流适配器为流对象提供了迭代器的接口

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

#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

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

#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;
    //从标准输入读入若干个整数,将排序后的结果输出
    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/m0_51354361/article/details/113823065