You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:35:23