我有两个容器(实际的容器是灵活的,未排序的,而不是排序对我来说无关紧要,所以最适合回答我的问题的是我将使用的)包含一些数据。我想比较这两个容器,并从第二个容器中删除所有“重复”,或者创建一个只包含“新”值的新容器。
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'导出。
答案 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)
hash_table 可以解决这个问题。
总时间复杂度为 O(n)。排序和比较方法具有时间复杂度 O(nlogn)。