c++ - C++20 范围是否具有过滤器或 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 范围库非常有限(只有几个 View )并且它匹配现有功能(如果 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);

https://stackoverflow.com/questions/67695084/

相关文章:

python - Groupby 在 pandas 中求和并根据条件/要求自定义 df

haskell - 如何在高阶函数haskell中使用Maybe?

javascript - Array.map 索引未定义?

c# - 为什么 TextInfo.ToTitleCase 在字母全部为大写的字符串上不能正常工作?

python - 断言错误 : Wrong values for d ['w' ] | deeple

javascript - 为什么减少数组的长度会使最后一个元素未定义但长度不变?

nuget - Cake NuGetRestore 找不到 nuget.exe

go - 从 k8s 事件处理程序中的对象获取注释

python - 如何过滤掉列表列中包含特定子序列的 Pandas DataFrame 中的行?

python - 如何在 Python 中将字符串转换为日期