没有自然排序顺序的两个std::向量之间的差

Difference between two std::vectors with no natural sorting order

本文关键字:两个 std 向量 之间 自然 排序 顺序      更新时间:2023-10-16

我正在寻找一种有效的方法来获得两个std::vectors之间的差异。它们所包含的对象没有任何自然的顺序;我最多能做的就是测试是否平等。这似乎排除了std::set_difference选项。

有比比较两个嵌套迭代器中的对象更好的解决方案吗?

目标是通过将可能的正匹配分组在一起来减少相等检验的数量。

我能想到的最好的方法是用第一个向量构建一个哈希映射,然后从哈希映射中减去第二个向量的所有元素。这意味着你需要为你的元素想出一个像样的哈希函数。

很简单,如果你存储的是指针,并且你的相等谓词是基于它的,你也可以基于指针整型值的哈希。

参见什么是好的哈希函数。

正如在注释中提到的,另一种可能性是在元素的某些属性上建立排序,并使用它来减少相等的可能性。您可能必须先对两个向量进行排序。

你可以利用向量的一个属性,它们有连续的内存分配,这意味着,向量有一个大的内存空间保留(大于使用,通常),没有花哨的优化,你可以直接比较内存空间。

在c++ 0x中,你有data()方法,它让你直接访问内存空间的开始。您可以使用memcmp来比较向量内的所有数据。

std::vector<char> vector_1;
std::vector<char> vector_2;
// data in to vector_1
// data in to vector_2
if(!memcmp(vector1.data(),vector_2.data(),SIZE_OF_BUFFER_TO_COMPARE))
{
    std::cout <<< "equal vectors" << std::endl;
}