我使用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?它很适合以上范围的组成。

最佳答案

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

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

07-24 09:49
查看更多