使用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. 输出差异的核心原因: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
相关产品推荐
相关产品推荐

