Почему нельзя отсортировать диапазон в range-v3? - PullRequest
2 голосов
/ 21 февраля 2020

Используя библиотеку Range-v3 (выпуск 0.10.0), я пытался создать диапазон из std :: vector, преобразовать его в другой диапазон и, наконец, отсортировать этот диапазон. Я ожидал, что шаг сортировки произведет другой диапазон, который я мог бы использовать позже. Но лучшее, что я мог придумать, было следующее:

std::vector<std::string> const input { "2", "3", "1" };
using namespace ranges;
std::vector<int> output = input
    | views::transform([](std::string s) { return std::stoi(s); })
    | to<std::vector>()
    | actions::sort

Обратите внимание на использование to<std::vector>() после шага преобразования и перед шагом сортировки. Кажется, это выделяет новый std::vector, когда все, что я хотел, это отсортировать диапазон , который произвел шаг преобразования.

Почему нет view::sort? Это хорошо вписалось бы в вышеприведенную композицию диапазонов.

1 Ответ

6 голосов
/ 21 февраля 2020

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

Ваше решение правильное - сохранить преобразованные элементы в векторе, а затем отсортировать их.

...