从两个容器中查找“新”项目

时间:2011-05-11 01:28:43

标签: c++ algorithm boost stl

我有两个容器(实际的容器是灵活的,未排序的,而不是排序对我来说无关紧要,所以最适合回答我的问题的是我将使用的)包含一些数据。我想比较这两个容器,并从第二个容器中删除所有“重复”,或者创建一个只包含“新”值的新容器。

by duplicate / newI表示以下内容: 容器1包含:[1,2,4,8,16] 容器2包含:[1,2,4,16,32]

运行算法后,新容器(或修改后的容器2)应包含: 容器3包含:[32]

请注意,我不希望'8'位于新容器(或修改后的容器)中,因为我只想找到'new'值。

我可以很容易地实现一个天真和缓慢的程序来自己做,但是我正在寻找最优雅和有效的方法来实现这一点(如果STL没有提供所有必要的工具/算法而没有滚动,那么Boost很好你自己的,否则自己也很好。)

那么......最好的方法是什么(阅读:最优雅,最有效率)?

提前致谢。

P.S。如果它完全相关,我正在使用它为DLL中的导出函数编写“diffing”工具。我有许多非常大的DLL,我想在这些DLL的最新版本中找到'new'导出。

3 个答案:

答案 0 :(得分:3)

看起来STL set_difference可能适合您。 here的示例:

// set_difference example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  int first[] = {5,10,15,20,25};
  int second[] = {50,40,30,20,10};
  vector<int> v(10);                           // 0  0  0  0  0  0  0  0  0  0
  vector<int>::iterator it;

  sort (first,first+5);     //  5 10 15 20 25
  sort (second,second+5);   // 10 20 30 40 50

  it=set_difference (first, first+5, second, second+5, v.begin());
                                               // 5 15 25  0  0  0  0  0  0  0

  cout << "difference has " << int(it - v.begin()) << " elements.\n";

  return 0;
}

答案 1 :(得分:0)

最简单的方法可能是排序然后迭代。由于两个容器都已排序,您可以直接比较每个索引(或取消引用的迭代器)是否相等,并且只有在不相等时才插入new(或从现有中删除)。这是O(n logn),取决于operator<operator==

答案 2 :(得分:0)

STL中的

hash_table 可以解决这个问题。

  1. 容器一中的所有元素插入到hash_table中。
  2. 对于容器二中的每个元素,检查它是否在hash_table中;如果没有,请将其推入容器三

总时间复杂度为 O(n)。排序和比较方法具有时间复杂度 O(nlogn)