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

为何对filter_view调用std::ranges::max会返回已被过滤的元素?

笔误导致过滤视图未生效:std::ranges::max误用原容器

问题代码

int foo() {
    const std::vector<int> elems{4, 5, 6, 2, 1, 9, 8};
    const auto is_even = [](int e) { return e % 2 == 0; };
    const auto cmp = [](int x, int y) { return x < y; };

    auto evens = elems | std::views::filter(is_even);  // 预期得到偶数序列:4 6 2 8
    return std::ranges::max(elems, cmp);  // 实际返回9,不符合预期
}

问题核心:明明想要对过滤后的偶数视图evens求最大值,却错误地将原容器elems传给了std::ranges::max,导致返回了原容器里的最大值9(本应被过滤的奇数)。

修正方案

把std::ranges::max的第一个参数改成过滤视图evens即可:

int foo() {
    const std::vector<int> elems{4, 5, 6, 2, 1, 9, 8};
    const auto is_even = [](int e) { return e % 2 == 0; };
    const auto cmp = [](int x, int y) { return x < y; };

    auto evens = elems | std::views::filter(is_even);  // 4 6 2 8
    return std::ranges::max(evens, cmp);  // 返回8,符合预期
}

说明

std::ranges::max支持所有符合C++范围概念的对象,包括filter_view这类视图。修正参数后,函数会正确遍历过滤后的偶数元素,返回其中的最大值8。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:42:41