2015-05-04 91 views
-4

是否有可能缩短这个方法...魔术在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,但我知道它们存在。所以我想这是可能的。

+0

'套 s'复制整个集合? – senfen

+0

看看https://cpplinq.codeplex.com – Oliver

+2

不知道这是你想要的,但'返回s.find(x)!= s.end();'更短。 – Heike

回答

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(); 

将在速度和清晰度更好。

+0

这就是我一直在寻找的! (带谓词的解决方案)。谢谢。 –

0

准确地找到该值,你可以写这样的事情:

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

,或者如果你想,要更加紧密看C#和可能希望使用自己的比较,使用C++ 11的λ和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()); 
} 

这种方式可以使自己的拉姆达功能查找特定的说法,不只是使用默认的可比性。请注意,第二个选项会较慢(线性),因为它必须遍历容器中的每个对象,并且不使用像BST或hashmaps这样的容器。