如何创建C++范围视图:保留首元素,筛选后续偶数至≥6元素出现
解决C++范围视图的筛选需求
你的问题出在管道操作的顺序上——你先取了第一个元素,接着就把它拿去过滤偶数,结果奇数的第一个元素被筛掉,整个视图直接为空了。正确的思路应该是把第一个元素和后续处理后的元素分开处理,再合并。
按照你的需求,我们需要:
- 单独保留原范围的第一个元素
- 对从第二个元素开始的部分,先筛选偶数,再截取到第一个大于等于6的元素之前
- 把这两部分视图拼接起来
对应的代码实现如下:
#include <vector> #include <ranges> #include <iostream> int main() { auto v = std::vector{43, 1, 3, 2, 4, 6, 7, 8, 19, 101}; auto first_element = v | std::views::take(1); auto rest_elements = v | std::views::drop(1) | std::views::filter([](int x) { return !(x & 1); }) | std::views::take_while([](int x) { return x < 6; }); auto r = std::views::concat(first_element, rest_elements); for (const auto &x : r) std::cout << x << ' '; // 输出:43 2 4 }
代码说明
std::views::drop(1):跳过第一个元素,处理后续所有元素std::views::filter:筛选出后续元素中的偶数std::views::take_while:从筛选后的偶数中,取到第一个大于等于6的元素为止(不包含该元素)std::views::concat:把第一个元素的视图和处理后的后续元素视图拼接成一个完整范围
这样就能严格按照你的预期规则生成结果了。
内容的提问来源于stack exchange,提问作者PaperBirdMaster
相关产品推荐
相关产品推荐

