我如何检查 ranges:: 像 find_if 这样的算法是否返回了一个值?

How do I check if ranges:: algorithms like find_if returned a value?

例如,如果我想查找集合中的最小元素,但只查找最小的 even 元素,我想调用 ranges::min_element过滤范围如下:

using ranges::views::filter;
using ranges::min_element;
std::vector<int> vals{1,2,3,4,5};
auto minVal = min_element(vals | filter([](int next){return next % 2 == 0;}));

如何检查返回的范围是否为空,如果不是,则访问该值?

这同样适用于其他范围算法,如ranges::findranges::find_if

很遗憾,您不能将临时范围传递给范围算法。

这是因为它们将在完成后 return 一个范围迭代器(可能 ranges::end(rng))。如果你传递一个临时的,returned 迭代器将是无效的;引用一个临时的。范围库检测到这一点并且 return 是一个虚拟标记,ranges::dangling 而不是迭代器。

执行此操作的正确方法是首先组成过滤范围然后调用算法。

std::vector<int> vals {1, 2, 3, 4, 5};
auto even_vals = vals | filter([](int val){return val % 2 == 0;});
auto minVal = min_element(even_vals);
if (minVal == even_vals.end())
    std::cout << "no values\n";
else
   std::cout << *minVal; // prints "2"

Demo