Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Permutation Iterator

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Permutation Iterator

Author: Тун Кнапен, Дэвид Абрахамс, Роланд Рихтер, Джереми Сик
Contact: Адаптер приводит два аргумента:

  • итератор до диапазона V, на котором будет применяться перестановка
  • Схема реиндексирования, которая определяет, как элементы V будут изменены.

Обратите внимание, что итератор перестановок не ограничивается строгими перестановками заданного диапазона 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 models

permutation_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_iteratorX,V1,R1,D1>D1>совместим сpermutation_iteratorY,V2,C2,R2,D2>D2>Xсовместим сYиE1конвертируем вE2.

permutation_iterator operations

В дополнение к тем операциям, которые требуются концепциями, чтоpermutation_iteratorмодели,permutation_iteratorобеспечивает следующие операции.

permutation_iterator();

Effects:Default constructs m_elt and m_order.

эксплицитныйpermutation_iterator(ElementIteratorx,IndexIteratory);

Effects:Constructs m_elt from x and m_order from 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
    );
Effects:Constructs m_elt from r.m_elt and m_order from y.m_order.

ссылкаоператор*()const;

Returns:*(m_elt + *m_order)

permutation_iterator&operator++();

Effects:++m_order
Returns:*this

Итератор элементовconst&base()const;

Returns:m_order
template <class ElementIterator, class IndexIterator>
permutation_iterator<ElementIterator, IndexIterator>
make_permutation_iterator(ElementIterator e, IndexIterator i);
Returns:permutation_iterator<ElementIterator, IndexIterator>(e, i)

Example

using 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
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:59:09/0.0088961124420166/1