为什么不能在 range-v3 中对范围进行排序?

Ang*_*ket 4 c++ c++20

使用 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
Run Code Online (Sandbox Code Playgroud)

注意在to<std::vector>()转换步骤之后和排序步骤之前的使用。std::vector当我想要的只是对转换步骤产生的范围进行排序时,这似乎分配了一个新的。

为什么没有view::sort?它非常适合上述范围的组成。

Ala*_*les 8

转换后的范围只是一个视图,在迭代视图时一次生成一个元素。它无法排序,因为无处可存储已排序的元素。假设的实现也将是低效的,因为每次需要对排序进行比较时,它都必须转换每个元素。

您的解决方案是将转换后的元素存储在向量中然后对它们进行排序是正确的。

  • 这两个都可能在内部生成一个元素列表,c++ api 只是让你明确要求它这样做,这样当你对百万元素视图进行排序时使用大量内存时,你就不会感到惊讶 (2认同)
  • 向量是一个范围吗? (2认同)
  • 它会中断视图管道,因为临时向量不是视图。如果您想要进一步急切处理,请使用操作。如果您想要惰性,请将向量存储到变量中,这样它就不是临时的。 (2认同)