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

Introduction and motivation

Boost , Chapter 1. Range 2.0 , Range Algorithms

Boost C++ LibrariesHomeLibrariesPeopleFAQMore

PrevUpHomeNext

В своей самой простой форме алгоритм Range Algorithm (или алгоритм на основе диапазона) - это просто алгоритм на основе итера, где аргументы два итератора были заменены аргументами один. Например, мы можем писать

#include <boost/range/algorithm.hpp>
#include <vector>
std::vector<int> vec = ...;
boost::sort(vec);

вместо

std::sort(vec.begin(), vec.end());

Однако возвратный тип алгоритмов диапазона почти всегда отличается от существующих алгоритмов на основе итератора.

Одна группа алгоритмов, таких как boost::sort(), просто вернет один и тот же диапазон, чтобы мы могли продолжать передавать диапазон вокруг и/или дополнительно изменить его. Из-за этого мы можем написать

boost:unique(boost::sort(vec));

сначала сортировать диапазон, а затем запустить уникальный() на сортированном диапазоне.

Алгоритмы, такие как boost::unique(), попадают в другую группу алгоритмов, которые возвращают (потенциально) суженные взгляды на исходный диапазон. По умолчанию boost::boost(rng>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Поэтому именно уникальные значения могут быть скопированы путем написания

boost::copy(boost::unique(boost::sort(vec)),
            std::ostream_iterator<int>(std::cout));

Алгоритмы, такие как boost::уник обычно возвращается диапазон: [boost::begin(rng),found). Однако это поведение может быть изменено путем предоставления range_return_ value в качестве параметра шаблона для алгоритма:

Выражение

Возвращение

boost::unique<boost::return_found>(rng<24>)

возвращает один итератор, такой как std::уник

boost::unique<boost::

возвращает диапазон [boost::begin(rng), found)<320> (это по умолчанию)

boost::unique<boost::

возвращает диапазон [boost::begin(rng), boost<32>::next(found>)<328>

boost::unique<boost::

возвращает диапазон [found, boost::end(rng)

boost::unique<boost::return_next_end>(rng)

возвращает диапазон [boost::next(found),boost::end(rng>)

boost::unique<boost::return_begin_end>(rng)

возвращает весь исходный диапазон.

Эта функциональность имеет следующие преимущества:

  1. он позволяет для бесместное функциональное программирование где вам не нужно использовать названные локальные переменные для хранения промежуточных результатов
  2. это очень безопасная, потому что алгоритм может проверить условия выхода и обрабатывать сложные условия, которые приводят к пустым диапазонам

Например, подумайте, как легко мы можем стереть дубликаты в сортированном контейнере:

std::vector<int> vec = ...;
boost::erase(vec, boost::unique<boost::return_found_end>(boost::sort(vec)));

Обратите внимание на использование boost::return_found_end. Что, если мы хотим стереть все дубликаты, кроме одного из них? В старомодном STL-программировании мы могли бы написать

// assume 'vec' is already sorted
std::vector<int>::iterator i = std::unique(vec.begin(), vec.end());
// remember this check or you get into problems
if (i != vec.end())
    ++i;
vec.erase(i, vec.end());

Одна и та же задача может быть выполнена просто с помощью

boost::erase(vec, boost::unique<boost::return_next_end>(vec));

и нет необходимости беспокоиться о создании недействительного диапазона. Кроме того, если контейнер является сложным, звонит vec.end() несколько раз будет дороже, чем использование алгоритма диапазона.


PrevUpHomeNext

Статья Introduction and motivation раздела Chapter 1. Range 2.0 Range Algorithms может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Range Algorithms ::


реклама


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

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