Author: | David Abrahams, Jeremy Siek, Thomas Witt |
---|---|
Contact: | dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de |
Organization: | Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction |
Date: | 2004-01-12 |
Copyright: | Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved |
abstract: |
---|
counting_iterator adapts an arithmetic type, such as int, by adding an operator* that returns the current value of the object.
template < class Incrementable , class CategoryOrTraversal = use_default , class Difference = use_default > class counting_iterator { public: counting_iterator(); counting_iterator(counting_iterator const& rhs); explicit counting_iterator(Incrementable x); Incrementable base() const; private: Incrementable current; // exposition };
The Incrementable type must be Default Constructible, Copy Constructible, and Assignable. The default distance is an implementation defined signed integral type.
counting_iterator models Readable Lvalue Iterator.
Furthermore, if you wish to create a counting iterator that is a Forward Traversal Iterator, then the following expressions must be valid:
Incrementable i, j; ++i // pre-increment i == j // operator equal
If you wish to create a counting iterator that is a Bidirectional Traversal Iterator, then pre-decrement is also required:
--i
If you wish to create a counting iterator that is a Random Access Traversal Iterator, then these additional expressions are also required:
counting_iterator::difference_type n; i += n n = i - j i < j
counting_iterator();
Returns: | A default constructed instance of counting_iterator. |
---|
counting_iterator(counting_iterator const& rhs);
Returns: | An instance of counting_iterator that is a copy of rhs. |
---|
explicit counting_iterator(Incrementable x);
Returns: | An instance of counting_iterator with current constructed from x. |
---|
reference operator*() const;
Returns: | current |
---|
counting_iterator& operator++();
Effects: | ++current |
---|
Incrementable base() const;
Returns: | current |
---|
template <class Incrementable> counting_iterator<Incrementable> make_counting_iterator(Incrementable x);
Returns: | An instance of counting_iterator<Incrementable> with current constructed from x. |
---|
This example fills an array with numbers and a second array with pointers into the first array, using counting_iterator for both tasks. Finally indirect_iterator is used to print out the numbers into the first array via indirection through the second array.
int N = 7; std::vector<int> numbers; typedef std::vector<int>::iterator n_iter; std::copy(boost::counting_iterator<int>(0), boost::counting_iterator<int>(N), std::back_inserter(numbers)); std::vector<std::vector<int>::iterator> pointers; std::copy(boost::make_counting_iterator(numbers.begin()), boost::make_counting_iterator(numbers.end()), std::back_inserter(pointers)); std::cout << "indirectly printing out the numbers from 0 to " << N << std::endl; std::copy(boost::make_indirect_iterator(pointers.begin()), boost::make_indirect_iterator(pointers.end()), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl;
The output is:
indirectly printing out the numbers from 0 to 7 0 1 2 3 4 5 6