C++20范围是否有filter或any_of的值(非 predicate )版本?

31moq8wy  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(83)

经典的C有时会为 predicate 算法选择_if后缀(相对于那些接受值的算法),例如find_if/findcount_if/count,有时它会选择not(例如any_of没有_if后缀,尽管它接受 predicate ,并且算法没有any_of值版本)。
据我所知,C
20 filterranges::any_of没有值重载。
我浏览了C +20的整个cppreference页面,没有发现任何东西,我认为这只是因为C++20范围库非常有限(只有少数视图),并且它匹配现有功能(在any_of的情况下)。
我最好的尝试是 Package 逻辑并给予一个新名称。

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

字符串
好消息:C++23有std::ranges::contains

qfe3c7zg

qfe3c7zg1#

C20范围是否有filter或any_of的值(非 predicate )版本?
不,C
20没有。但它很容易编写:

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

字符串
值得庆幸的是,C++23确实引入了一个新的ranges::contains来使这变得更容易:

std::ranges::contains(r, value);


或者,如果你认为这太长了,你可以添加一个助手:

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


您可以使用它来缩短any_of调用:

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


或者你可以使用任意数量的库来编写占位符-das,最新的是Boost.Lambda2

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

相关问题