diff --git a/iterator_adaptors.htm b/iterator_adaptors.htm index af3211b..7db55cc 100644 --- a/iterator_adaptors.htm +++ b/iterator_adaptors.htm @@ -124,6 +124,8 @@ Function Output Iterator Adaptor
Dave
@@ -150,6 +152,8 @@
Jens Maurer
contributed the generator iterator
adaptor.
+ Toon Knapen contributed the permutation
+ iterator adaptor.
Class template
iterator_adaptor
diff --git a/permutation_iterator.htm b/permutation_iterator.htm
new file mode 100644
index 0000000..fc19d23
--- /dev/null
+++ b/permutation_iterator.htm
@@ -0,0 +1,159 @@
+
+
+
+
+Permutation Iterator Adaptor
+
Defined in header boost/permutation_iterator.hpp
+The permutation iterator adaptor provides an iterator to a permutation of a given range. +(see definition of permutation). +The adaptor takes two arguments +
Note that the permutation iterator is not limited to strict permutations of the given range V. +The distance between begin and end of the reindexing iterators is allowed to be smaller compared to the +size of the range V, in which case the permutation iterator only provides a permutation of a subrange of V. +The indexes neither need to be unique. In this same context, it must be noted that the past the end permutation iterator is +completely defined by means of the past-the-end iterator to the indices
+ +++ + ++namespace boost { + template <class IndexIterator> + class permutation_iterator_policies; + + template <class ElementIterator, class IndexIterator> + class permutation_iterator_generator; + + template <class ElementIterator, class IndexIterator> + typename permutation_iterator_generator<ElementIterator, IndexIterator>::type + make_permutation_iterator(ElementIterator& base, IndexIterator& indexing); +} ++
The permutation_iterator_generator
is a helper class whose purpose
+is to construct a permutation iterator type. This class has
+two template arguments, the first being the iterator type over the range V, the
+second being the type of iterator over the indices.
+
+
++ + ++template <class ElementIterator, class IndexIterator> +class permutation_iterator_generator +{ +public: + typedef iterator_adaptor<...> type; // the resulting permutation iterator type +} ++
Parameter | +Description | +
---|---|
ElementIterator | +The iterator over the elements to be permuted. This type must be a model +of RandomAccessIterator | + + +
IndexIterator | +The iterator over the new indexing scheme. This type must at least be a model +of ForwardIterator | . +The
operator+=(distance)
, this operation will take linear time
+in case the OrderIterator is a model of ForwardIterator instead of amortized constant time.
+
+make_permutation_iterator()
function provides a
+convenient way to create permutation iterator objects. The function
+saves the user the trouble of explicitly writing out the iterator
+types.
+
+++ ++template <class ElementIterator, class IndexIterator > +typename permutation_iterator_generator<ElementIterator, IndexIterator>::type +make_permutation_iterator(ElementIterator& base, IndexIterator& order); ++
++ ++ typedef std::vector< int > element_range_type; + typedef std::list< int > index_type; + + static const int element_range_size = 10; + static const int index_size = 4; + + element_range_type elements( element_range_size ); + std::iota( elements.begin(), elements.end(), 0 ); + + index_type indices( index_size ); + std::iota( indices.begin(), indices.end(), element_range_size - index_size ); + std::reverse( indices.begin(), indices.end() ); + + typedef permutation_iterator_generator< element_range_type::iterator, index_type::iterator >::type permutation_type; + permutation_type begin = make_permutation_iterator( elements.begin(), indices.begin() ); + permutation_type it = begin; + permutation_type end = make_permutation_iterator( elements.begin(), indices.end() ); + + std::cout.setf( std::ios_base::left ); + std::cout << std::setw( 50 ) << "The original range is : "; + std::copy( elements.begin(), elements.end(), std::ostream_iterator< int >( std::cout, " " ) ); + std::cout << "\n"; + + std::cout << std::setw( 50 ) << "The reindexing scheme is : "; + std::copy( indices.begin(), indices.end(), std::ostream_iterator< int >( std::cout, " " ) ); + std::cout << "\n"; + + std::cout << std::setw( 50 ) << "The permutated range is : "; + std::copy( begin, end, std::ostream_iterator< int >( std::cout, " " ) ); + std::cout << "\n"; ++