是否可以缩短此方法...
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 :(得分: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这样的容器。