2

经典 C++ 有时会为谓词算法选择 _if 后缀(而不是那些取值的),例如find_if//有时它没有find count_if(例如,虽然它需要谓词,但没有 _if 后缀,并且没有值版本的算法)。countany_ofany_of

据我所知,C++20filterranges::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();
}
4

1 回答 1

5

C++20 范围是否具有过滤器或 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);
于 2021-05-25T21:18:43.570 回答