目标是检查两个集合是否不相交,这是迄今为止的代码:
#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;'))
我尝试引用文档this和this,但它没有帮助解决问题但让我更加困惑,因为我来自Java背景。任何帮助解决这个问题将不胜感激!感谢。
答案 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