C++ 输出迭代器
- 输出迭代器用于修改容器中的值。
- 解引用输出迭代器允许我们改变容器中的值。
- 它不允许我们从容器中读取值。
- 它是单向且只写的迭代器。
- 它可以递增,但不能递减。
- 输出迭代器可以使用的运算符有 递增运算符(++)、递减运算符(–)和赋值运算符(=) 。
- 输出迭代器的两个主要子类是:
- 插入迭代器
- 输出流迭代器
插入迭代器
- 插入迭代器是用于在指定位置插入元素的迭代器。
- 插入迭代器上的赋值运算符会在当前位置插入新元素。
语法
template<class Container, class Iterator>
insert_iterator<container> inserter(Container &x,Iterator it);
参数
x :要插入新元素的容器。
it :一个指向要修改位置的迭代器对象。
让我们看一个简单的示例:
#include <iostream> // std::cout
#include <iterator> // std::front_inserter
#include <vector> // std::list
#include <algorithm> // std::copy
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
在上面的示例中,insert_iterator被应用于copy算法,将向量v2的元素插入到由它指定的位置的向量v1中。
Ostream iterator
- ostream迭代器用于连续写入输出流(比如cout)的输出迭代器。
- 使用basic_ostream对象创建ostream迭代器。
- 当在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; invalid
X!=Y; invalid
- Dereferencing :输出迭代器可以被解引用为左值。
*X=7;
- Incrementable : 一个输出迭代器可以通过使用 operator++() 函数进行递增。
X++;
++X;
输出迭代器的限制
- 赋值但不能访问 :我们可以将一个输出迭代器作为左值进行赋值,但我们不能将其作为右值进行访问。
假设’A’是一个输出迭代器类型,’x’是一个整数变量:
*A = x; // valid
x = *A; // invalid
- 无法减量 :我们可以使用operator++()函数增加输出迭代器,但是无法减少输出迭代器。
假设 ‘A’ 是一个输出迭代器类型:
A++; // not valid
++A; // not valid
- 多次通过算法 :输出迭代器不能用作多次通过算法。因为输出迭代器是单向的,只能向前移动。因此,不能使用它来多次遍历容器。
-
关系运算符 :输出迭代器不能通过使用任何关系运算符进行比较。
假设 ‘A’ 和 ‘B’ 是两个迭代器:
A = =B; // not valid
A = =B; // not valid
- 算术运算符 :输出迭代器不能与算术运算符一起使用。因此,我们可以说输出迭代器只能以顺序方式前进。
假设’A’是一个输出迭代器 :
A + 2; // invalid
A + 5; // invalid