Pap*_*ter 2 c++ c++20 std-ranges
我有一个价值观的集合:
auto v = std::vector{43, 1, 3, 2, 4, 6, 7, 8, 19, 101};
Run Code Online (Sandbox Code Playgroud)
我想在这个值集合上应用遵循以下条件的视图:
这是我尝试过的视图:
auto v = std::vector{43, 1, 3, 2, 4, 6, 7, 8, 19, 101};
auto r = v |
std::views::take(1) |
std::views::filter([](const int x) { return !(x & 1); }) |
std::views::take_while([](const int x) { return x < 6; });
for (const auto &x : r)
std::cout << x << ' ';
Run Code Online (Sandbox Code Playgroud)
但执行甚至没有进入打印循环,因为视图是空的。我的猜测是所有标准都会立即应用:
我所期待的:
2, 4, 6, 8)。2, 4)。43 2 4被打印。如何对我的值集合建立一个符合我预期的行为的视图?
使用range-v3,您可以用来views::concat连接范围的第一个元素和剩余的过滤元素,例如:
auto v = std::vector{43, 1, 3, 2, 4, 6, 7, 8, 19, 101};
auto r = ranges::views::concat(
v | ranges::views::take(1),
v | ranges::views::drop(1)
| ranges::views::filter([](const int x) { return !(x & 1); })
| ranges::views::take_while([](const int x) { return x < 6; })
);
Run Code Online (Sandbox Code Playgroud)