![]() |
![]() ![]() ![]() ![]() |
![]() |
Permutation IteratorBoost , ,
| ||||||||||||||||||||||||||||
| Author: | Тун Кнапен, Дэвид Абрахамс, Роланд Рихтер, Джереми Сик | |||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Contact: | Адаптер приводит два аргумента:
Обратите внимание, что итератор перестановок не ограничивается строгими перестановками заданного диапазона V. Расстояние между началом и концом реиндексирующих итераторов допускается меньше по сравнению с размером диапазона V, в этом случае итератор перестановки обеспечивает только перестановку поддиапазона V. Индексы не должны быть уникальными. В этом же контексте следует отметить, что прошедший конечный итератор перестановки полностью определяется посредством прошедшего-конечного итератора к индексам. Reference
template< class ElementIterator
, class IndexIterator
, class ValueT = use_default
, class CategoryT = use_default
, class ReferenceT = use_default
, class DifferenceT = use_default >
class permutation_iterator
{
public:
permutation_iterator();
explicit permutation_iterator(ElementIterator x, IndexIterator y);
template< class OEIter, class OIIter, class V, class C, class R, class D >
permutation_iterator(
permutation_iterator<OEIter, OIIter, V, C, R, D> const& r
, typename enable_if_convertible<OEIter, ElementIterator>::type* = 0
, typename enable_if_convertible<OIIter, IndexIterator>::type* = 0
);
reference operator*() const;
permutation_iterator& operator++();
ElementIterator const& base() const;
private:
ElementIterator m_elt; // exposition only
IndexIterator m_order; // exposition only
};
template <class ElementIterator, class IndexIterator>
permutation_iterator<ElementIterator, IndexIterator>
make_permutation_iterator( ElementIterator e, IndexIterator i);
permutation_iterator requirementsИтератор элементовМодель итератора случайного доступа.ИндексаторДолжен быть смоделированный итератор. Тип значенияИндексатордолжно быть преобразовано в разностный типИтератор элементов. permutation_iterator modelspermutation_iteratorмоделирует те же концепции обхода итератора, что иIndexIteratorи те же концепции доступа итератора, что иИтератор элементов. ЕслиIndexIteratorОдноместный итератор иИтератор элементовмодели Считываемый итератор затемpermutation_iteratorмодели Input Iterator. ЕслиIndexIteratorмодели Forward Traversal Iterator иИтератор элементовмодели Считываемый Lvalue Iterator затемpermutation_iteratorмодели Forward Iterator. ЕслиIndexIteratorмодели двунаправленного поперечного итератора иИтератор элементовмодели Считываемый Lvalue Iterator затемpermutation_iteratorмодели Bidirectional Iterator. ЕслиIndexIteratorмодели Random Access Traversal Iterator иИтератор элементовмодели Считываемый Lvalue Iterator затемpermutation_iteratorмодели Random Access Iterator. permutation_iterator permutation_iterator operationsВ дополнение к тем операциям, которые требуются концепциями, чтоpermutation_iteratorмодели,permutation_iteratorобеспечивает следующие операции. permutation_iterator();
эксплицитныйpermutation_iterator(ElementIteratorx,IndexIteratory);
template< class OEIter, class OIIter, class V, class C, class R, class D >
permutation_iterator(
permutation_iterator<OEIter, OIIter, V, C, R, D> const& r
, typename enable_if_convertible<OEIter, ElementIterator>::type* = 0
, typename enable_if_convertible<OIIter, IndexIterator>::type* = 0
);
ссылкаоператор*()const;
permutation_iterator&operator++();
Итератор элементовconst&base()const;
template <class ElementIterator, class IndexIterator> permutation_iterator<ElementIterator, IndexIterator> make_permutation_iterator(ElementIterator e, IndexIterator i);
Exampleusing namespace boost; int i = 0; 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 ); for(element_range_type::iterator el_it = elements.begin() ; el_it != elements.end() ; ++el_it) *el_it = std::distance(elements.begin(), el_it); index_type indices( index_size ); for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it ) *i_it = element_range_size - index_size + std::distance(indices.begin(), i_it); std::reverse( indices.begin(), indices.end() ); typedef permutation_iterator< element_range_type::iterator, index_type::iterator > 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 << "The original range is : "; std::copy( elements.begin(), elements.end(), std::ostream_iterator< int >( std::cout, " " ) ); std::cout << "\n"; std::cout << "The reindexing scheme is : "; std::copy( indices.begin(), indices.end(), std::ostream_iterator< int >( std::cout, " " ) ); std::cout << "\n"; std::cout << "The permutated range is : "; std::copy( begin, end, std::ostream_iterator< int >( std::cout, " " ) ); std::cout << "\n"; std::cout << "Elements at even indices in the permutation : "; it = begin; for(i = 0; i < index_size / 2 ; ++i, it+=2 ) std::cout << *it << " "; std::cout << "\n"; std::cout << "Permutation backwards : "; it = begin + (index_size); assert( it != begin ); for( ; it-- != begin ; ) std::cout << *it << " "; std::cout << "\n"; std::cout << "Iterate backward with stride 2 : "; it = begin + (index_size - 1); for(i = 0 ; i < index_size / 2 ; ++i, it-=2 ) std::cout << *it << " "; std::cout << "\n"; Результатом является: The original range is : 0 1 2 3 4 5 6 7 8 9 The reindexing scheme is : 9 8 7 6 The permutated range is : 9 8 7 6 Elements at even indices in the permutation : 9 7 Permutation backwards : 6 7 8 9 Iterate backward with stride 2 : 6 8 Статья Permutation Iterator раздела может быть полезна для разработчиков на c++ и boost. :: Главная :: ::
|
|||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||||||||||||||||||