C++ Output Iterators
Iterators :
Iterators serve as a link between algorithms and STL containers, allowing the data inside the container to be modified. They let you to iterate through the container, access and assign values, and apply various operators to them in order to get the required outcome.
Output iterators :
The Output Iterator is a C++ iterator that is commonly used to alter the value in the container. Dereference is used to change the value of a container output iterator. The Output iterator does not allow you to read the value from container. One-way and write-only iterators are commonly referred to as output iterators. In general, output iterators in C++ can be increased, but not decremented. Assignment operator(=), increment operator(++), and decrement operator(--) are the operators that may be used for an output iterator in general.
The aim of output iterators is the polar opposite of that of input iterators. This iterator is used for output operations in a sequential manner. In other words, it is employed in the assignment of values. However, it is unable to access the values. It is a companion to the input iterators, which allow you to access but not assign values. It is a one-way iterator, just as the input iterator. You can only increase the iterator once you've assigned a value, and you can't decrease the output iterator in any manner.
Types of Output iterators :
In general, an Output Iterator has two major subclasses, as shown below:
- Insert iterator
- Ostream iterator
Insert Iterator :
The insert iterator is a type of iterator that is used to place an element at a certain location. An assignment operator inserts the new element at the current place on the insert iterator.
Syntax :
template<class Container, class Iterator>
insert_iterator<container> inserter(Container &c,Iterator itr);
Components :
The arguments of the insert iterator's syntax are as follows:
c : This is where the new element is usually placed.
itr : It is an iterator object that normally points towards the spot that has to be changed.
Example :
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v1,v2;
for (int k=10; k<=15; k++)
{
v1.push_back(k);
v2.push_back(k+2);
}
vector<int>::iterator itr = v1.begin();
advance (itr,3);
copy (v2.begin(),v2.end(),inserter(v1,itr));
cout<<"Elements of v1 are :";
for ( itr = v1.begin(); itr!= v1.end(); ++itr )
cout << ' ' << *itr;
cout << '\n';
return 0;
}
Output :
Elements of v1 are : 10 12 13 13 14 15 16 17 14 15
Explanation :
In the above example, output iterator is used for output operations in a sequential manner. In other words, it is employed in the assignment of values. However, it was is unable to access the values. It is a companion to the input iterators, which allow you to access but not assign values. We could only increase the iterator once we have assigned a value, and we can't decrease the output iterator in any manner as shown.
2. Ostream iterator :
The ostream iterator is a type of output iterator that is commonly used to write to the output stream like cout in a sequential manner. The basic ostream object is used to generate an ostream iterator. When the ostream operator is used with an assignment operator, a new element is usually added to the output stream.
Syntax :
template<class Tc, class charTc=char, class traits=char_traits<charT>> class
Components :
The following are the arguments of the ostream iterator's syntax:
Tc : It refers to the sort of items that will be placed in a container.
charTc : This specifies the type of items that the ostream may handle.
Character features : These are the character traits that the stream is capable of handling for the elements.
Example :
#include <iostream>
#include<iterator>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> vec;
for(int x=6;x<=10;x++)
{
vec.push_back(x*10);
}
ostream_iterator<int> out(cout,", ");
copy(vec.begin(),vec.end(),out);
return 0;
}
Output :
60, 70, 80, 90, 100
Explanation :
In the above example, we used the ostream iterator. We introduced a vector list named vec. Further with a for loop, we used the ostream iterator in order to print the output required.
Properties Of Output Iterator :
Here are some of the outstanding features given by the Output iterator.
Equality/Inequality operator :
The output iterator cannot be compared with an equality or inequality operator.
Dereferencing :
The output iterator can really be typically dereferenced for the value of a lvalue.
Incrementable :
The output iterator may be incriminated simply by using the operator(++) function.
Drawbacks of Output Iterator :
The following are the limits that are applicable to the output Iterator in general:
- Assigning but not accessing:
We can allocate an output iterator as a lvalue, but programmers will not be able to access it as a rvalue.
- Can't be decremented:
We may often increase the output iterator by using the operator(++) method, but it cannot be decremented.
- Multi-pass algorithm:
In C++, you can't use an output iterator as a multi-pass algorithm. Because an output iterator is unidirectional and can only travel in one way, it can't be used to proceed through the container numerous times.
- Relational Operators:
When programmers use any of the relational operators, the output iterators cannot be compared.
- Arithmetic Operators:
Because the output iterator can only go ahead in a sequential fashion, it cannot be used with arithmetic operators.