检查两个向量<t> </t>之间的差异

时间:2012-11-27 00:49:33

标签: c++ sorting c++11 vector

假设您有2个向量说v1v2,其中包含以下值:

v1 = {8,4,9,9,1,3};
v2 = {9,4,3,8,1,9};

检查它们是否“平等”的最STL方法是什么?我定义“相等”意味着无论顺序如何,内容都是相同的。我更愿意这样做而不进行排序。

我倾向于构建两个std::map<double, int>来计算每个向量的元素。

所有,我需要的是算法中的布尔值是/否。

你说什么?

Stack Overflow上的其他对话依据对向量进行排序,我宁愿避免这种情况。因此这个新线程。

6 个答案:

答案 0 :(得分:4)

  

我倾向于构建两个std :: map来计算每个向量的元素。

这比创建排序向量要慢得多。 (另请注意,std::map 是通过排序提供的;它只是使用红黑树或AVL树来实现这一点。)地图是为插入和查找的均匀混合而优化的数据结构;但是你的用例是一大堆插入,然后是一堆没有重叠的查找。

我只是对矢量进行排序(或制作副本并对其进行排序,如果不允许销毁源副本),然后使用内置operator ==的矢量。

答案 1 :(得分:4)

对向量进行排序并调用set_difference仍然是最好的方法。 如果副本很重,那么两个未排序数组之间的比较会更糟吗?

如果您希望当前数组不变,可以复制当前数组吗?

v1 = {8,4,9,9,1,3};
v2 = {9,4,3,8,1,9};

// can trade before copy/sort heavy work
if (v1.size() != v2.size()){
}     
std::vector<int> v3(v1);
std::vector<int> v4(v2);

sort(v3.begin(), v3.end());
sort(v4.begin(), v4.end());

return v3 == v4;

答案 2 :(得分:3)

我认为由于某种原因你不能对矢量进行排序,很可能是因为你仍然需要它们的原始顺序,或者复制起来很昂贵。否则,只需对它们进行排序。

在每个向量中创建一个“视图”,允许您以任何顺序查看向量。您可以使用指针向量来执行此操作,指针按顺序开始指向元素。然后对两个视图进行排序,为每个向量生成一个排序视图。然后比较两个视图,比较它们视图顺序中的两个向量。这样可以避免对矢量本身进行排序。

答案 3 :(得分:1)

最初的想法是以集合的方式工作,因为这就是你实际上在思考的问题,但这确实需要排序。这可以在O(n)中完成,方法是将两者都转换为哈希映射并检查那里的相等性。

答案 4 :(得分:-1)

只取第一个向量并将其与第二个向量中的每个元素进行比较。

如果第一个中的一个值在第二个中找不到,则向量是不同的。 在最坏的情况下,需要O(n * m)时间,其中n =第一矢量的大小,m =第二矢量的大小。

答案 5 :(得分:-1)

这个util方法将帮助你比较2 int [],如有任何问题请告诉我

public static boolean compareArray(int [] v1,int [] v2){

    boolean returnValue = false;

    if(v1.length != v2.length)
        returnValue = false;

    if(v1.length == 0 || v2.length == 0)
        returnValue = false;

    List<Integer> intList =  Ints.asList(v2);

    for(int element : v1){
        if(!intList.contains(element)){
            returnValue = false;
            break;
        }else{
            returnValue = true;
        }
    }