The iterator library that is part of the C++ Standard Library provides the following helpers for writing generic code:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include template<class Container> void foo(Container& c) { // Generic way to obtain (constant) iterators auto b = std::begin(c); // (1) auto cb = std::cbegin(c); // (2) auto e = std::end(c); // (3) auto ce = std::cend(c); // (4) // Generic way to obtain (constant) reverse iterators auto rb = std::rbegin(c); // (5) auto crb = std::crbegin(c); // (6) auto re = std::rend(c); // (7) auto cre = std::crend(c); // (8) // Generic way to manipulate iterators auto i = std::next(b, 1); // (9) auto d = std::distance(b, i); // (10) auto p = std::prev(i, 1); // (11) std::advance(p, 1); // (12) } |
All the functions above are defined in the header. It’s always preferable to use these generic functions when writing the generic code instead of using equivalent member functions of the containers.
Functions from (1) to (8) are defined for built-in arrays and for every type that provides members begin() and end(). Note, that std::cbegin() requires the definition of the constant version of member function c.begin().
Functions for (9) to (12): std::prev() and std::next() are generic functions to increment or decrement the iterator by the specified number of hops (by default, 1), function std::distance() is a generic function to calculate the number of hops between the specified pair of iterators and function std::advance() is a generic equivalent of the operator +=.
Please note, if either the argument of std::next() and std::advance() is negative or the argument of std::prev() is positive then the specified iterator must be bidirectional iterator (see Categories of Iterators in C++).
Design. Code. Compile. Deploy.
Start Free Trial
Free C++Builder Community Edition

