没有自然排序顺序的两个std :: vector之间的差异

时间:2013-03-22 10:55:10

标签: c++ stdvector set-difference

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

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

2 个答案:

答案 0 :(得分:0)

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

我能想到的最好的方法是使用第一个向量构建一个hashmap,然后从hashmap中减去第二个向量的所有元素。这意味着你需要为你的元素提供一个不错的哈希函数。

平凡地说,如果你存储指针,并且你的等式谓词是基于它的,你也可以将你的哈希基于该指针的整数值。

请参阅What is a good hash function?

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

答案 1 :(得分:0)

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

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