![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Transform IteratorBoost , ,
|
Author: | Дэвид Абрахамс, Джереми Сик, Томас Витт | |||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Contact: | ЕслиСсылказатемссылкачленпреобразование_iterator=result_of ЕслиЗначениеявляетсяuse_default, тоvalue_typeчленremove_cv ЕслиИтераторМодели Считываемый итератор 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 АргументИтератордолжен моделировать читаемый итератор. transform_iterator modelsПолучившийсятрансформатор_iteratorмодели наиболее усовершенствованный из следующих, который также моделируетсяИтератор.
Transform_iteratorмоделирует наиболее совершенную стандартную концепцию обхода, которая смоделирована.Итератораргумент. ЕслиTransform_iteratorявляется моделью Readable Lvalue Iterator, то он моделирует следующие оригинальные концепции итератора в зависимости от того, чтоИтератормодели аргументов.
Еслитрансформировать_iteratorмодели Записываемый итератор Lvalue является изменяемым итератором (как определено в старых требованиях к итератору). Transform_iterator transform_iterator operationsВ дополнение к операциям, требуемым концепциями, смоделированнымиTransform_iterator,Transform_iteratorобеспечивает следующие операции. Transform_iterator();
transform_iterator(Iteratorconst&x,UnaryFunctionf);
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 );
UnaryFunctionfunctor()const;
Итераторconst&base()const;
эталоноператор*()const;
transform_iterator&operator++();
transform_iterator&operator--();
template <class UnaryFunction, class Iterator> transform_iterator<UnaryFunction, Iterator> make_transform_iterator(Iterator it, UnaryFunction fun);
template <class UnaryFunction, class Iterator> transform_iterator<UnaryFunction, Iterator> make_transform_iterator(Iterator it);
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 |