![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Permutation IteratorBoost , ,
|
Author: | Тун Кнапен, Дэвид Абрахамс, Роланд Рихтер, Джереми Сик | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Contact: | Адаптер приводит два аргумента:
Обратите внимание, что итератор перестановок не ограничивается строгими перестановками заданного диапазона V. Расстояние между началом и концом реиндексирующих итераторов допускается меньше по сравнению с размером диапазона V, в этом случае итератор перестановки обеспечивает только перестановку поддиапазона V. Индексы не должны быть уникальными. В этом же контексте следует отметить, что прошедший конечный итератор перестановки полностью определяется посредством прошедшего-конечного итератора к индексам. Referencetemplate< 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 |