Доступна ли полная реализация стандартной библиотеки на основе диапазона? - PullRequest
3 голосов
/ 14 октября 2011

После прочтения Андрея Александреску «Итераторы должны уйти», я попытался найти замену стандартной библиотеке, которая использует диапазоны, а не итераторы.

Лучшее, что я могу выкопать, это boost::range, но документация довольно слабая, поэтому я действительно не знаю, позволяет ли она выполнять полную замену итераторов при использовании стандартной библиотеки.

Существует ли надежный и полнофункциональный способ использования стандартных библиотечных алгоритмов на основе диапазона?

Ответы [ 2 ]

4 голосов
/ 14 октября 2011

В документации Boost.Range отсутствуют следующие алгоритмы (с использованием той же классификации, что и в документации по стандарту и диапазону):

  • Не мутирует

    • all_of, any_of, none_of [C ++ 11]
    • find_if_not [C ++ 11]
    • is_permutation [C ++ 11]
  • 1024 * Минимальное видоизменение *

    • copy_if [C ++ 11]
    • move [C ++ 11]
    • move_backward [C ++ 11]
    • iter_swap
    • generate_n
    • shuffle [C ++ 11]
  • Раздел, связанный

    • is_partitioned [C ++ 11]
    • partition_copy [C ++ 11]
    • partition_point [C ++ 11]
  • Сортировка связана

    • partial_sort_copy (*)
    • is_sorted_until [C ++ 11]
  • куча связанных

    • is_heap_until [C ++ 11]
  • Мин. / Макс. Элемент

    • min, max, minmax [minmax - это C ++ 11]
    • minmax_element [C ++ 11]

Другими словами, Boost.Range реализует почти все C ++ 03 <algorithm> (тоже немного <numeric>, я не проверял), плюс даже некоторые из C ++ 11, такие как copy_n и is_sorted которые явно отсутствовали. Некоторые из отсутствующих вещей не связаны с диапазоном, например min, max и minmax (которые работают с двумя элементами или одним списком элементов инициализатора) и iter_swap (который работает с двумя итераторами). Есть также ошибки документации, поскольку partial_sort_copy действительно , кажется, здесь. Никаких кубиков на generate_n, который, похоже, является нашим единственным неудачником.

Кроме того, использование этих алгоритмов описано:

В своей самой простой форме Алгоритм диапазона (или алгоритм на основе диапазона) - это просто алгоритм на основе итератора, в котором два аргумента итератора были заменены одним аргументом диапазона.

с сопровождающим примером:

std::vector<int> vec = ...;
boost::sort(vec);
// instead of:
// std::sort(vec.begin(), vec.end());

Одним из основных отличий является возвращаемое значение, при котором замены стандартных алгоритмов, которые возвращают один итератор, могут вместо этого возвращать диапазон или один итератор в зависимости от потребностей пользователя. Подробности доступны на той же странице и в документации каждого отдельного алгоритма. Есть и примеры.

Я думаю, что вы очень плохо читали документацию.

0 голосов
/ 08 февраля 2017

Обновление старого вопроса:

Range-v3 предоставляет не только Диапазоны, но и совместимую с диапазоном версию алгоритмов Стандартной библиотеки, предназначенную для компоновки, как ленивую, так и энергичную версии, и загружаемую только для заголовков. Требуется C ++ 11 или более новый компилятор.

Определенно стоит потратить время, если вас интересуют такие вещи. https://github.com/ericniebler/range-v3

Руководство пользователя: https://ericniebler.github.io/range-v3/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...