比较List / set元素

时间:2010-06-09 01:43:30

标签: 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);
}

你如何对集合做同样的事?

1 个答案:

答案 0 :(得分:9)

如果你有两套:

std::set<int> s1;
std::set<int> s2;

并且您希望获取一个元素而不是另一个元素,您可以使用std::set_difference

std::set<int> difference;
std::set_difference(s1.begin(), s1.end(),
                    s2.begin(), s2.end(),
                    std::inserter(difference, difference.begin()));

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

std::set_difference适用于任何两个已排序的范围,因此您也可以将其与其他容器一起使用(例如,如果您的std::list已经排序,则可以对它们使用std::set_difference找到差异)。