C++教程-C++输出迭代器
C++ 输出迭代器
- 输出迭代器(Output Iterator)是用于修改容器中的值的迭代器。
- 解引用输出迭代器允许我们修改容器的值。
- 输出迭代器不允许我们从容器中读取值。
- 它是单向且只写的迭代器。
- 它可以递增,但不能递减。
- 可以用于输出迭代器的运算符有递增运算符(++)、递减运算符(--)和赋值运算符(=)。
输出迭代器的两个主要子类是:
- 插入迭代器(Insert Iterator)
- 流迭代器(Ostream Iterator)
插入迭代器
- 插入迭代器是一种迭代器,用于在指定位置插入元素。
- 在插入迭代器上使用赋值运算符会在当前位置插入新元素。
语法
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; // 无效