C ++中的Magic,受C#LINQ的启发

时间:2015-05-04 10:27:19

标签: c# c++ linq

是否可以缩短此方法...

bool check_if_any(set<int> &s, int x)
{
    for (int i : s)
        if (i == x)
            return true;
    return false;
}

...所以它看起来像C#LINQ方式......

bool check_if_any(set<int> &s, int x)
{
    return s.any(i => i == x);
}

......或者其他一些方式,但更短?我不知道C ++中的lambdas,但我知道它们存在。所以我想这是可能的。

2 个答案:

答案 0 :(得分:3)

通常,要查找集合中的任何项目是否与谓词匹配,您可以使用

bool check_if_any(set<int> &s, int x)
{
    return std::any_of(s.begin(), s.end(), [&](int v){ return v==x;});
}

但在这种情况下

return s.find(x) != s.end();

在速度和清晰度上都会更好。

答案 1 :(得分:0)

要准确找到该值,您可以编写类似的内容:

bool check_if_any(const std::set<int>& mySet, int x) {
    return mySet.find(x) != mySet.end();
}

或者如果您希望它更接近C#并且可能想要使用您自己的比较器,请使用C ++ 11 lambda和std::find_if()方法:

bool check_if_any(const std::set<int>& mySet, int x) {
    return (std::find_if(
        mySet.begin(), mySet.end(), 
        [](int y) { return x == y; }
    ) != mySet.end());
}

这样你可以使自己的lambda函数来查找特定的参数,而不仅仅是使用默认的可比较。请注意,第二个选项将更慢(线性),因为它必须遍历容器中的每个对象,并且不使用像BST或hashmaps这样的容器。