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

Transform 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

Transform Iterator

Author: Дэвид Абрахамс, Джереми Сик, Томас Витт
Contact: ЕслиСсылказатемссылкачленпреобразование_iterator=result_of::reference;::type). В противном случаессылкаСсылка.

ЕслиЗначениеявляетсяuse_default, тоvalue_typeчленremove_cv>::type. В противном случаезначение_типравно.Значение.

ЕслиИтераторМодели Считываемый итератор Lvalue и еслиИтератормодели Random Access Traversal Iterator, затемiterator_categoryконвертируется вrandom_access_iterator_tag.Итератормодели Bidirectional Traversal Iterator, затемiterator_categoryконвертируется вbidirectional_iterator_tag. В противном случаеiterator_categoryконвертируется вforward_iterator_tag.Итераторне моделируется Считываемый Lvalue Iteratoriterator_categoryконвертируется вinput_iterator_tag.

transform_iterator requirements

ТипUnaryFunctionдолжен быть приемлемым, копируемым конструируемым, а выражениеf(*i)должно быть действительным, еслиfявляется конст-объектом типаявляется объектом типаИтератора, и если типf(*i)должен бытьрезультатом_of::reference]>::type.

АргументИтератордолжен моделировать читаемый итератор.

transform_iterator models

Получившийсятрансформатор_iteratorмодели наиболее усовершенствованный из следующих, который также моделируетсяИтератор.

  • Записываемый итератор Lvalue, еслиTransform_iterator::referenceявляется неконст-ссылкой.
  • Readable Lvalue Iterator ifTransform_iterator::reference— это ссылка.
  • Читаемый итератор иначе.

Transform_iteratorмоделирует наиболее совершенную стандартную концепцию обхода, которая смоделирована.Итератораргумент.

ЕслиTransform_iteratorявляется моделью Readable Lvalue Iterator, то он моделирует следующие оригинальные концепции итератора в зависимости от того, чтоИтератормодели аргументов.

If Iterator models then transform_iterator models
Итератор Single Pass Итератор ввода
Вперед Traversal Iterator Передний итератор
Двунаправленный итератор поворотов Двунаправленный итератор
Итератор случайного доступа Итератор случайного доступа

Еслитрансформировать_iteratorмодели Записываемый итератор Lvalue является изменяемым итератором (как определено в старых требованиях к итератору).

Transform_iteratorX,R1,V1>совместим сTransform_iteratorY,R2,V2>, если и только еслиXсовместим сY.

transform_iterator operations

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

Transform_iterator();

Returns:An instance of transform_iterator with m_f and m_iterator default constructed.

transform_iterator(Iteratorconst&x,UnaryFunctionf);

Returns:An instance of transform_iterator with m_f initialized to f and m_iterator initialized to x.
template<class F2, class I2, class R2, class V2>
transform_iterator(
      transform_iterator<F2, I2, R2, V2> const& t
    , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
    , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
);
Returns:An instance of transform_iterator with m_f initialized to t.functor() and m_iterator initialized to t.base().
Requires:OtherIterator is implicitly convertible to Iterator.

UnaryFunctionfunctor()const;

Returns:m_f

Итераторconst&base()const;

Returns:m_iterator

эталоноператор*()const;

Returns:m_f(*m_iterator)

transform_iterator&operator++();

Effects:++m_iterator
Returns:*this

transform_iterator&operator--();

Effects:--m_iterator
Returns:*this
template <class UnaryFunction, class Iterator>
transform_iterator<UnaryFunction, Iterator>
make_transform_iterator(Iterator it, UnaryFunction fun);
Returns:An instance of transform_iterator<UnaryFunction, Iterator> with m_f initialized to f and m_iterator initialized to x.
template <class UnaryFunction, class Iterator>
transform_iterator<UnaryFunction, Iterator>
make_transform_iterator(Iterator it);
Returns:An instance of transform_iterator<UnaryFunction, Iterator> with m_f default constructed and m_iterator initialized to x.

Example

Это простой пример использования класса Transform_iterators для генерации итераторов, которые умножают (или добавляют) значение, возвращаемое путем отмены ссылки на итератор. В этом примере лучше использовать библиотеку лямбда.

int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
const int N = sizeof(x)/sizeof(int);
typedef boost::binder1st< std::multiplies<int> > Function;
typedef boost::transform_iterator<Function, int*> doubling_iterator;
doubling_iterator i(x, boost::bind1st(std::multiplies<int>(), 2)),
  i_end(x + N, boost::bind1st(std::multiplies<int>(), 2));
std::cout << "multiplying the array by 2:" << std::endl;
while (i != i_end)
  std::cout << *i++ << " ";
std::cout << std::endl;
std::cout << "adding 4 to each element in the array:" << std::endl;
std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus<int>(), 4)),
          boost::make_transform_iterator(x + N, boost::bind1st(std::plus<int>(), 4)),
          std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;

Результатом является:

multiplying the array by 2:
2 4 6 8 10 12 14 16
adding 4 to each element in the array:
5 6 7 8 9 10 11 12

Исходный код для этого примера можно найти здесь.

Статья Transform Iterator раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

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