如何检查 range:: 算法(如 find_if)是否返回了值?

And*_*dyG 3 c++ range range-v3 c++20

例如,如果我想找到一个集合的最小元素,但只想找到最小的偶数元素,我想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;}));
Run Code Online (Sandbox Code Playgroud)

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

这同样适用于其他的算法范围等ranges::findranges::find_if等。

And*_*dyG 7

不幸的是,您无法将临时范围传递给范围算法。

这是因为它们将ranges::end(rng)在完成后返回一个范围迭代器(可能)。如果你传递一个临时的,返回的迭代器将是无效的;引用一个临时的。范围库检测到这一点并返回一个虚拟哨兵,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"
Run Code Online (Sandbox Code Playgroud)

演示