![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Introduction and motivationBoost , Chapter 1. Range 2.0 , Range Adaptors
Адаптер диапазона— класс, который обертывает существующий диапазон, чтобы обеспечить новый диапазон с другим поведением. Поскольку поведение Диапазонов определяется их ассоциированными итераторами, Адаптер Диапазона просто заворачивает базовые итераторы новыми специальными итераторами. В этом примере #include <boost/range/adaptors.hpp> #include <boost/range/algorithm.hpp> #include <iostream> #include <vector> std::vector<int> vec; boost::copy( vec | boost::adaptors::reversed, std::ostream_iterator<int>(std::cout) ); Итераторы из< vec | boost::adaptors::reversed возвращает адаптер диапазона, где тип итератора теперь является типом итератора диапазона< Существует два способа построения адаптера диапазона. Первое – это использование< Почему я предпочитаю синтаксис< std::vector<int> vec; boost::copy( boost::adaptors::reverse(vec), std::ostream_iterator<int>(std::cout) ); Это может выглядеть не так плохо, но когда мы применяем несколько адаптеров, это становится намного хуже. Просто сравните. std::vector<int> vec; boost::copy( boost::adaptors::unique( boost::adaptors::reverse( vec ) ), std::ostream_iterator<int>(std::cout) ); то std::vector<int> vec; boost::copy( vec | boost::adaptors::reversed | boost::adaptors::uniqued, std::ostream_iterator<int>(std::cout) ); Кроме того, некоторые генераторы адаптеров принимают аргументы сами по себе, и эти аргументы выражены с нотацией вызова функции. В таких ситуациях вы действительно оцените краткость< Composition of Adaptorsдиапазон Адапторы являются мощным дополнением к алгоритмам Range. Причина в том, что адаптерыортогональныалгоритмам. Рассмотрим, например, эти алгоритмы диапазона:
Что делать, если мы хотим копировать элемент<
Эти алгоритмы определены только для поддержания отношения один к одному со стандартными библиотечными алгоритмами. Этот подход добавления алгоритма страдает от комбинаторного взрыва. Неизбежно многие алгоритмы отсутствуют< Range Adaptor alternative to copy_if algorithmboost::copy_if( rng, pred, out ); можно выразить как boost::copy( rng | boost::adaptors::filtered(pred), out ); Range Adaptor alternative to count_if algorithmboost::count_if( rng, pred ); можно выразить как boost::size( rng | boost::adaptors::filtered(pred) ); Это означает, что многие алгоритмы больше не нуждаются в оптимизированной реализации с суффиксом< std::vector<int> vec; boost::replace_copy_if( rng, std::back_inserter(vec), pred, new_value ); С помощью адаптеров и алгоритмов мы можем выразить это так: std::vector<int> vec; boost::push_back(vec, rng | boost::adaptors::replaced_if(pred, new_value)); Последний код имеет несколько преимуществ:
1. it is more efficient
because we avoid extra allocations as might happen with 2. этогибкий, так как впоследствии мы можем применить еще больше адаптеров, например: boost::push_back(vec, rng | boost::adaptors::replaced_if(pred, new_value) | boost::adaptors::reversed); 3. онболее безопасен, потому что не используется неограниченный выходной итератор. Таким образом, составАдаптеров дальности имеет следующие последствия: 1. нам больше не нужны многие из<
2. we can generate a multitude of new algorithms on the fly, for example,
above we generated Другими словами: Range Adaptors are to algorithms what algorithms are to containers Статья Introduction and motivation раздела Chapter 1. Range 2.0 Range Adaptors может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Range Adaptors ::
|
||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |