从两个容器中查找'new'项
Find 'new' items from two containers
>我有两个容器(实际的容器是灵活的,未排序与排序对我来说无关紧要,所以任何最适合回答我的问题的东西都是我将使用的),其中包含一些数据。我想比较这两个容器,然后从第二个容器中删除所有"重复项",或者创建一个仅包含"新"值的新容器。
通过重复/新我的意思是以下内容:容器 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 中的所有元素插入hash_table。
- 对于容器 2 中的每个元素,检查它是否在hash_table容器 3 中;如果没有,请将其推入容器 3。
总体时间复杂度为 O(n)。排序和比较方法具有时间复杂度O(nlogn)。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在C++中查找文件
- 模板元程序查找相似的连续类型名称
- 在UNIX系统中使用DIR查找文件的字节大小
- 查找最接近的大于当前数字的数字的索引
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 查找后更改类变量
- 使用正则表达式regex_search在字符串中查找字符串
- 使用gcc从静态链接的文件中查找可选符号
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 在C++中查找范围的长度
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 重载运算符new[]的行为取决于析构函数
- 算法问题:查找从堆栈中弹出的所有序列
- 在Windows中查找扬声器输出的当前音量级别
- 如何在C++中使用X509证书模在令牌中查找私钥
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在 for 循环中查找问题时遇到困难
- 从两个容器中查找'new'项