比较List/set元素

cpx*_*cpx 0 c++ list set

我想比较两组并通过迭代第一组显示第二组中缺少的元素.

我已经完成了使用列表,但它似乎是在无序列表上进行迭代迭代以找到元素.

#include <iostream>
#include <list>
using std::list;

bool isExist(list <int> &original, int i)
{
 list <int>::iterator iter;

 for (iter = original.begin(); iter != original.end(); iter++)
 {
  if (*iter == i) {
   original.splice(original.end(), original, iter);
   return true; }
 }
 return false;
}

void FindMissing(list <int> &original, list <int> &missing)
{
 int count_exist = 0;

 list <int>::iterator iter;

 for (iter = missing.begin(); iter != missing.end(); iter++)
 {if (isExist(original, *iter))
  count_exist++;}

 int count_missing = original.size() - count_exist;

 iter = original.begin();

 while(count_missing > 0)
 {
  std::cout << *iter++ << std::endl;
  count_missing--;
 }
}

int main()
{
 list <int> list_data_1;
 list <int> list_data_2;

 //Fill the list.
 for (int i = 0; i < 5; i++)
 list_data_1.push_back(i);

 //Fill second list with missing elements.
 list_data_2.push_back(3);
 list_data_2.push_back(1);
 list_data_2.push_back(4);

 FindMissing(list_data_1, list_data_2);
}
Run Code Online (Sandbox Code Playgroud)

你怎么用套装做同样的事情?

Jam*_*lis 9

如果你有两套:

std::set<int> s1;
std::set<int> s2;
Run Code Online (Sandbox Code Playgroud)

并且您希望获得一个但不是另一个的元素集,您可以使用std::set_difference:

std::set<int> difference;
std::set_difference(s1.begin(), s1.end(),
                    s2.begin(), s2.end(),
                    std::inserter(difference, difference.begin()));
Run Code Online (Sandbox Code Playgroud)

difference将包含所有s1但不在其中的元素s2.

std::set_difference适用于任何两个已排序的范围,因此您也可以将其与其他容器一起使用(例如,如果您的std::lists已经分类,您可以使用std::set_difference它们来查找差异).