我如何将循环中的两个集合作为if条件进行比较

时间:2017-10-27 19:21:53

标签: c++

我有2套。我想从第一组中选择一个元素并将其与第二组中的所有元素进行比较,如果它不等于非元素,则做一些事情!我应该为第一组的所有元素重复它!我试过这段代码:

int main() {
set<int> Y;
set<int> X;
for (auto iter = Y.begin(); iter != Y.end(); iter++) {

    for (auto iter1 = X.begin(); iter1 != X.end(); iter1++) {

        if (*iter != *iter1) {
            B[*iter1 - 1] = 1;
        }
    }
    return 0;
}

但它没有给我正确的答案!我想如果条件正确的话我就不写了!

3 个答案:

答案 0 :(得分:2)

  

我有2套。我想从第一组中选择一个元素并将其与第二组中的所有元素进行比较,如果它不等于它们,则做一些事情!

您要找的是std::set_difference(只要您的容器已排序,std::set当然是一个已排序的容器。)

只需摆脱你的循环,调用上面的函数,找到第一组中的元素,而不是第二组中的元素,然后迭代它们。
在几乎所有现实案例中,复杂性应该低于您的方法(您最多2(N+M-1)次比较与固定数量的N*M比较,其中N的大小为M第一组,{{1}}是第二组的大小。) 缺点是需要分配内存来存储要迭代的元素。如果这是一个你可以支付的价格,主要取决于真正的问题,很难说。

答案 1 :(得分:1)

你实现的if条件只是检查第二组中任何元素的条件是否失败,因此采取行动。但是,根据您的描述,您希望在采取行动之前检查第二组中所有元素的比较:

for (auto iter=set1.begin(); ...) {
  bool equal_toany = False;
  for (auto iter1=set2.begin(); ...) {
     if (*iter == *iter1) {
        equal_toany = True;
        break;
     }
   }
   if (!equal_toany) {
     dostuff() // B[*iter -1] =1
   }
}

答案 2 :(得分:1)

使用std::set::find()判断某个值是否为集合的成员:

for (auto iter = Y.begin(); iter != Y.end(); iter++) {
    if (X.find(*iter) != X.end())
        B[*iter1 - 1] = 1;
    }
}