如何检查两组是否不相交?

时间:2017-09-16 09:03:44

标签: c++ c++11

目标是检查两个集合是否不相交,这是迄今为止的代码:

#include <iostream>
#include <cstdlib>
#include <unordered_set>
using namespace std;

bool isDisjoint(int set1[], int len1, int set2[], int len2); 
int main()
{
    int set1[] = {10, 5, 3, 4, 6};
    int set2[] = {8, 7, 9, 3};
    if (isDisjoint(set1,sizeof(set1),set2,sizeof(set2)))
        cout<<"DISJOINT";
    else
        cout<<"NOT DISJOINT";

    return 0;
}

bool isDisjoint(int set1[], int len1, int set2[], int len2)
{
    unordered_set<int> set;


    for(int i=0;i<len1;i++)
        set.insert(set1[i]);

    for(int j=0;j<len2;j++)
    {
        if(set2[j]==set.find(set2[j]))
    //-----------^^^^-----------------
            return false;

    }

    return true;
}

但是,如评论中所示,当我尝试检查元素是否存在于无序集合中时,我遇到了一个问题:

  

二进制表达式的无效操作数('int'和         'iterator'(又名'__hash_const_iterator         * GT;'))

我尝试引用文档thisthis,但它没有帮助解决问题但让我更加困惑,因为我来自Java背景。任何帮助解决这个问题将不胜感激!感谢。

2 个答案:

答案 0 :(得分:2)

支票应该针对set.end(),而不是针对set2[j]

if (set.find(set2[j]) != set.end()) {
    ...
}

请注意,您致电isDisjoint传递sizeof(set1)sizeof(set2),这是不正确的:您应该在C ++ 17中传递sizeof(set1)/sizeof(set1[0])std::size(set1)

答案 1 :(得分:1)

find返回iterator,请参阅this

只需替换

if(set2[j]==set.find(set2[j]))

if(set.find(set2[j]) != set.end())

此外,sizeof(set1)返回集合的字节大小。为了得到实数,你必须除以sizeof(int)的元素数,因此:

sizeof(set1)/sizeof(int)

这将改变这行代码:

if (isDisjoint(set1,sizeof(set1),set2,sizeof(set2)))

进入这个:

int set1_size = sizeof(set1)/sizeof(int);
int set2_size = sizeof(set2)/sizeof(int);

if (isDisjoint(set1,set1_size,set2,set2_size)
    //blah blah the rest