C++ 输出迭代器

  • 输出迭代器(Output Iterator)是用于修改容器中的值的迭代器。
  • 解引用输出迭代器允许我们修改容器的值。
  • 输出迭代器不允许我们从容器中读取值。
  • 它是单向且只写的迭代器。
  • 它可以递增,但不能递减。
  • 可以用于输出迭代器的运算符有递增运算符(++)、递减运算符(--)和赋值运算符(=)。
  • 输出迭代器的两个主要子类是:

    • 插入迭代器(Insert Iterator)
    • 流迭代器(Ostream Iterator)

1.png

插入迭代器

  • 插入迭代器是一种迭代器,用于在指定位置插入元素。
  • 在插入迭代器上使用赋值运算符会在当前位置插入新元素。

语法

template <class Container, class Iterator>

insert_iterator<container> inserter(Container &x, Iterator it);

参数

  • x:要在其中插入新元素的容器。
  • it:指向要修改的位置的迭代器对象。

让我们看一个简单的例子:

#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    vector<int> v1, v2;
    for (int i = 1; i <= 5; i++)
    {
        v1.push_back(i);
        v2.push_back(i + 2);
    }
    vector<int>::iterator it = v1.begin();
    advance(it, 3);
    copy(v2.begin(), v2.end(), inserter(v1, it));
    cout << "Elements of v1 are :";
    for (it = v1.begin(); it != v1.end(); ++it)
        cout << ' ' << *it;
    cout << '\n';
    return 0;
}

输出:

Elements of v1 are : 1 2 3 3 4 5 6 7 4 5

在上面的例子中,将插入迭代器应用于复制算法,以在由it指向的指定位置将向量v2的元素插入到向量v1中。

流迭代器

  • 流迭代器是用于连续写入输出流(例如cout)的输出迭代器。
  • 使用basic_ostream对象创建流迭代器。
  • 当在流迭代器上使用赋值运算符时,它会将新元素插入输出流。

语法

template <class T, class charT=char, class traits=char_traits<charT>>class ostream_iterator;

Ostream 迭代器类的成员函数

Ostream_iterator<T, charT, traits>& operator=(const T& value);
Ostream_iterator<T, charT, traits>& operator*();
Ostream_iterator<T, charT, traits>& operator++();
Ostream_iterator<T, charT, traits>& operator++(int);

参数

  • T:要插入容器中的元素的类型。
  • charT:ostream可以处理的元素的类型,例如char ostream。
  • traits:流处理元素的字符特性。

让我们看一个简单的例子:

#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    vector<int> v;
    for (int i = 1; i <= 5; i++)
    {
        v.push_back(i * 10);
    }
    ostream_iterator<int> out(cout, ",");
    copy(v.begin(), v.end(), out);
    return 0;
}

输出:

10,20,30,40,50

在上面的例子中,out是ostream_iterator的对象,用于在向量元素之间添加分隔符','。

让我们再看一个ostream迭代器的简单例子:

#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    ostream_iterator<int> out(cout, ",");
    *out = 5;
    out++;
    *out = 10;
    out++;
    *out = 15;
    return 0;
}

输出:

5,10,15,

输出迭代器的特性

  • 相等/不相等运算符:输出迭代器不能使用相等或不等运算符进行比较。假设X和Y是两个迭代器:
X == Y; 不合法
X != Y; 不合法
  • 解引用:输出迭代器可以作为左值进行解引用。
*X = 7;
  • 可递增:输出迭代器可以使用递增运算符(++)进行递增。
X++;
++X;

输出迭代器的限制

  • 赋值但不访问:我们可以将输出迭代器作为左值进行赋值,但我们不能将其作为右值进行

假设'A'是输出迭代器类型,'x'是一个整数变量:**

*A = x; // 有效
x = *A; // 无效
  • 不能递减:我们可以使用operator++()函数递增输出迭代器,但是不能递减输出迭代器。

假设'A'是输出迭代器类型:

A++; // 无效
++A; // 无效
  • 多次遍历算法:输出迭代器不能用作多次遍历算法。由于输出迭代器是单向的,只能向前移动,因此不能多次遍历容器。
  • 关系运算符:输出迭代器不能使用任何关系运算符进行比较。

假设'A'和'B'是两个迭代器:

A == B; // 无效
A != B; // 无效
  • 算术运算符:输出迭代器不能使用算术运算符。因此,我们可以说输出迭代器只能按顺序向前移动。

假设'A'是输出迭代器:

A + 2; // 无效
A + 5; // 无效

标签: C++语言, C++语言教程, C++语言技术, C++语言学习, C++语言学习教程, C++语言下载, C++语言开发, C++语言入门教程, C++语言进阶教程, C++语言高级教程, C++语言面试题, C++语言笔试题, C++语言编程思想