具有多个谓词的 C++11 算法

Posted

技术标签:

【中文标题】具有多个谓词的 C++11 算法【英文标题】:C++11 algorithms with multiple predicates 【发布时间】:2013-12-24 04:25:02 【问题描述】:

std::find_if 等来自 algorithm 标头的函数非常有用,但对我来说有一个严重的限制,即每次调用 count_if 时我只能使用 1 个谓词。

例如,给定一个像std::vector 这样的容器,我想同时应用find_if 的相同迭代,多个谓词;标准库中有什么东西可以在保持这种功能性方法的同时实现这一点?

【问题讨论】:

【参考方案1】:

只需将它们与 lambda 组合:

std::find_if(begin(vec), end(vec),
    [](elem_t val) 
        return f1(val) || f2(val);
    );

【讨论】:

哦,比我想象的要简单得多 但是使用这种方法,不同谓词的结果最终会出现在相同的输出中,如果我想将结果分派给每个谓词的特定对象怎么办? @user2485710 - 为此您编写自己的算法。 @user2485710:对于每个不同的目标使用std::copy_if 可能是最简单的,但这涉及到源容器的多次传递,因此使用for 循环和if (predicate1(val)) dest1.push_back(val); else if ... 可能更有效拉姆达。 (如果您关心性能,请始终以您的数据为基准。) @user2485710:我不确定你的意思。什么输出?谓词的结果进入算法以决定要做什么。对于find_if,这意味着如果结果为true 则终止,或者如果结果为false 则继续。你有一个具体的例子来说明你想做的事情吗?因为我可能有解决办法。

以上是关于具有多个谓词的 C++11 算法的主要内容,如果未能解决你的问题,请参考以下文章

具有多个条件和一个参数的谓词

STL算法设计理念 - 谓词,一元谓词demo

STL 算法中函数对象和谓词

STL算法中函数对象和谓词

核心数据对多关系 NSPredicate 来获取

使用迭代器按谓词重新排列