从两个容器中查找'new'项

Find 'new' items from two containers

本文关键字:查找 new 两个      更新时间:2023-10-16

>我有两个容器(实际的容器是灵活的,未排序与排序对我来说无关紧要,所以任何最适合回答我的问题的东西都是我将使用的),其中包含一些数据。我想比较这两个容器,然后从第二个容器中删除所有"重复项",或者创建一个仅包含"新"值的新容器。

通过重复/新我的意思是以下内容:容器 1 包含: [1, 2, 4, 8, 16]容器 2 包含: [1, 2, 4, 16, 32]

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

请注意,我不希望"8"在新容器(或修改后的容器)中,因为我只想查找"新"值。

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

所以。。。什么是"最佳"(阅读:最优雅和最有效的)方法?

提前谢谢。

附言如果它完全相关,我正在使用它为从 DLL 导出的函数编写一个"比较"工具。我有许多非常大的 DLL,我想在这些 DLL 的最新版本中找到"新"导出。

看起来STL set_difference可能适合您。 这里的例子:

// 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;
}

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

STL中的hash_table可以解决这个问题。

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

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