c++ 简化一个函数来检查`std::set`中是否存在特定值

fnvucqvd  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(152)

我用C++写了一个函数来检查std::set中是否存在一个特定的值。函数如下:

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

我熟悉C#中的LINQ,其中相同的函数可以写得更简洁:

bool CheckIfAny(Set<int> s, int x)
{
    return s.Any(i => i == x);
}

我想简化C函数,使其与C#版本一样短。
有人能告诉我如何使用 C
提供的功能重构C++函数吗?

vtwuwzda

vtwuwzda1#

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

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

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

drkbr07n

drkbr07n2#

要准确地找到这个值,你可以写这样的东西:

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函数来寻找特定的参数,而不仅仅是使用default comparable。请注意,第二个选项会更慢(线性),因为它必须遍历容器中的每个对象,并且不使用像BST或hashmaps这样的容器。

相关问题