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

使用std::views::drop_while过滤异常及|运算符功能咨询

问题与解答

问题描述

相关代码:

static constexpr auto v = {0, 1, 2, 3, 4, 5};
for (int n : v | std::views::drop_while([](int i) { return i < 3; }))
   std::cout << n << ' ';

执行后输出:

3 4 5

但将Lambda表达式中的小于号(<)改为大于号(>)后,输出变为:

0 1 2 3 4 5

需要解答两个问题:

  1. 上述输出差异的原因是什么?
  2. 代码中|运算符的功能是什么?

解答

1. 输出差异的核心原因:std::views::drop_while的工作逻辑

std::views::drop_while是C++20新增的范围视图工具,它的规则很明确:
从范围的第一个元素开始,只要元素满足给定的判断条件(谓词),就持续丢弃;一旦遇到第一个不满足条件的元素,就停止丢弃,保留这个元素以及后面所有的元素。

  • 当Lambda是return i < 3时:
    遍历v的元素,0、1、2都符合i<3的条件,会被依次丢弃;碰到3时,3<3不成立,丢弃操作立刻停止,剩下的3、4、5全部保留,所以输出3 4 5。

  • 当Lambda改为return i > 3时:
    第一个元素是0,0>3不满足条件,drop_while直接终止丢弃流程,整个范围的所有元素(0到5)都被保留下来,因此输出全部元素。

2. |运算符的作用:范围视图的管道传递

这里的|不是普通的按位或/逻辑或运算符,而是C++20专为范围视图设计的管道运算符。它的功能是把左侧的范围(这里是v,一个初始化列表构成的范围)作为输入,传递给右侧的视图适配器(std::views::drop_while),生成一个经过处理的新视图。

这种写法和std::views::drop_while(v, [](int i){...})是等价的,但管道写法更符合流式编程的直觉,尤其是在串联多个视图操作时(比如v | std::views::filter(...) | std::views::transform(...)),可读性会大幅提升。


内容的提问来源于stack exchange,提问作者Seshadri R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:27:47