C++20 范围是否具有过滤器的值(非谓词)版本或 any_of?

Do C++20 ranges have value(not predicate) version of filter or any_of?

经典 C++ 有时会为谓词算法选择 _if 后缀(相对于那些取值的算法),例如find_if/find count_if/count 有时它会 not(例如 any_of 没有 _if 后缀,尽管它带有谓词,并且没有 any_of 值版本的算法)。

据我所知,C++20 filterranges::any_of 没有值重载。

我浏览了 C++20 的整个 cppreference 页面,但一无所获,我认为这只是因为 C++20 范围库非常有限(只有几个视图)并且它与现有功能相匹配(以防万一any_of).

我最好的尝试是包装逻辑并给它一个新名称。

template <typename Range, typename Value>
static bool contains(const Range& range, const Value& value)
{
    return std::ranges::find(range, value) != range.end();
}

Do C++20 ranges have value(not predicate) version of filter or any_of?

没有

但是很容易写:

std::ranges::any_of(r, [&](auto const& e){ return e == value; })

或者,如果觉得太长,您可以添加一个助手:

inline constexpr auto equals = [](auto const& value){
    return [=](auto const& e){ return e == value; };
};

您可以用来缩短 any_of 通话时间:

std::ranges::any_of(r, equals(value));

或者您可以使用任意数量的库来编写占位符 lambda,最近 Boost.Lambda2:

std::ranges::any_of(r, _1 == value);