通过按索引选择范围的元素来创建视图

时间:2020-10-04 20:29:58

标签: c++ range-v3

在range-v3中,是否有比通过范围的任意索引选择范围的元素更有效的方式(更少的步骤,更简洁,更富表现力,更优雅,更高效……)来创建视图。使用views :: counted加上views :: concat

auto v = std::vector<int> {6,7,8,9,10,11};
auto v1 = views::counted(ranges::begin(v) + 1, 1); // [7]
auto v2 = views::counted(ranges::begin(v) + 3, 1); // [9]
auto v3 = views::counted(ranges::begin(v) + 4, 1); // [10]
auto vFinal = views::concat(v1,v2,v3); // [7,9,10]

1 个答案:

答案 0 :(得分:2)

您可以通过将索引放在一个范围内并调用ranges::views::concat来结束对ranges::views::for_each的调用,该调用将每个元素映射到一个返回范围的函数,然后将所有内容串联起来。

auto v = std::vector<int>{6,7,8,9,10,11};
auto i = std::vector<int>{1,3,4};
auto vFinal = i
    | ranges::views::for_each([&v](auto i) { return v | ranges::views::slice(i, i+1); });

https://godbolt.org/z/Wocb8W