我知道 STL 有 set_difference ,但我只需要知道 2 set 是否不相交。我已经分析了我的代码,这大大降低了我的应用程序的速度。有没有一种简单的方法可以查看 2 个集合是否不相交,或者我是否需要滚动自己的代码?

编辑:我也试过 set_intersection 但花了同样的时间......

最佳答案

修改了 hjhill 的代码,通过去掉 count() 调用将复杂性降低了 O(log n) 倍。

template<class Set1, class Set2>
bool is_disjoint(const Set1 &set1, const Set2 &set2)
{
    if(set1.empty() || set2.empty()) return true;

    typename Set1::const_iterator
        it1 = set1.begin(),
        it1End = set1.end();
    typename Set2::const_iterator
        it2 = set2.begin(),
        it2End = set2.end();

    if(*it1 > *set2.rbegin() || *it2 > *set1.rbegin()) return true;

    while(it1 != it1End && it2 != it2End)
    {
        if(*it1 == *it2) return false;
        if(*it1 < *it2) { it1++; }
        else { it2++; }
    }

    return true;
}

我现在已经编译并测试了这段代码,所以它应该很好。

关于c++测试2组是否不相交,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1964150/

10-13 05:54