为何对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
相关产品推荐
相关产品推荐

