Introduction
Iterator is an essential part in STL. We can use iterator to:
- traverse the elements of sequence or associative containers.
- work with STL’s algorithm
There are five kinds of iterators:
- Input Iterator
- Forward Iterator: only moves ahead
- Bidirectional Iterator: can move forward or backward
- Random Access Iterator: can randomly any valid position
- Output Iterator
- All above three iterators can be an output iterator.
Common Iterator Wrapper
Inserters
front_inserterback_inserterinserter
In most STL’s algorithms, users are responsible for allocating space for the output. But most
time we donot know the space we need in advance. For example, copy
vector<int> source{1,2,3};
vector<int> target;
copy(source.begin(), source.end(), target.begin());
The above program may crash. We can fix it by initializing the target with a size of
source.size(). It is easy that we forget this kind of initialization. back_inserter comes to
help here.
copy(source.begin(), source.end(), back_inserter(target));
back_inserter turns the moving the forward operation into a push_back operation.
vector<int> source{1,2,3};
deque<int> target;
set<int> s;
// the same with: `front_inserter` and `inserter`
copy(source.begin(), source.end(), front_inserter(target));
copy(source.begin(), source.end(), inserter(s, s.end()));
IO related
istream_iterator- used to consume input stream
ostream_iterator- used to print values
istream_iterator
vector<int> v;
istringstream s("1 2 3");
istream_iterator<int> ii(s);
copy(ii, istream_iterator<int>(), back_inserter(v));
It automatically coverts the input stream to the specified data type and put them into the container.
ostream_iterator
If we want to print all the elements in a container, how can we implement it? We can use a range
for clause.
vector<int> v{1,2,3};
for (int vv: v) {
cout << vv << ", "
}
cout << endl;
//^1, 2, 3, $
We can also use a ostream_iterator.
copy(v.begin(), v.end(), ostream_iterator<int>(cout, ", "));
cout << endl;
//^1, 2, 3, $
Common functions
advance(iter, distance): no iterator returneddistance(start_iter, end_iter): returns the distancenext(iter, distance=1): returns updated iteratorprev(iter, distance=1): returns updated iteratorbegin(container): returns the starting iteratorend(container): returns the last iterator