简化函数以检查C 中的`sTD :: set`中是否存在特定值

Simplifying a function to check if a specific value exists in a `std::set` in C++

本文关键字:set 是否 存在 sTD 函数 检查 中的      更新时间:2023-10-16

我已经在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 功能?

一般而言,要找到收集中的任何项目是否匹配谓词您可以使用

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

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

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

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这样的容器。