如何比较 2 个向量并根据比较创建单独的向量

Posted

技术标签:

【中文标题】如何比较 2 个向量并根据比较创建单独的向量【英文标题】:How to compare 2 vectors and create a separate vector based on the comparison 【发布时间】:2017-03-29 16:57:30 【问题描述】:

我正在考虑创建一个算法来比较 2 个向量 (v1,v2),并创建一个新向量 v3 来保存 v1v2 之间未共享的值。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(int args[])

vector<int> v1 =  1,2,3,4,5,6,7,8,9 ;
vector<int> v2 =  1,2,6 ;
vector<int> v3; //V3 should equal = 3,4,5,7,8,9.

return 0;

向量总是被排序的。

【问题讨论】:

v1v2 是否必须排序?如果是这样,您可能可以在循环中使用std::mismatch 来查找两个向量中都不存在的值。 你能假设它们会被排序吗? 感谢您的回复!是的,这 2 个向量将始终被排序,我现在来看看 std::mismatch。 虽然排序使事情变得更容易,但这不是必需的。只需复制第一个向量,对于每个复制的值,在 v2 中搜索完全相同的值。如果该值存在 - 从 v3 中删除该值 这能回答你的问题吗? STL set_symmetric_difference usage 【参考方案1】:

如果如您的示例中那样对范围进行了排序,那么您可以使用std::set_symmetric_difference。它将返回两个范围之间未共享的所有元素。以您为例,您将使用

std::set_symmetric_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v3));

所以把它们放在一起,我们就有了

int main()

    std::vector<int> v1 =  1,2,3,4,5,6,7,8,9 ;
    std::vector<int> v2 =  1,2,6 ;
    std::vector<int> v3; //V3 should equal = 3,4,5,7,8,9.

    std::set_symmetric_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v3));

    for (auto e : v3)
        std::cout << e << " ";

    return 0;

输出:

3 4 5 7 8 9

Live example

【讨论】:

完美!这正是我所需要的,非常感谢。 std::set_difference 会更合适吗?否则,v2 中尚未在 v1 中的元素将包含在结果中。 @FrançoisAndrieux 可能是。我需要与 OP 核实 @SamRobinson 如果v2 中有10,您希望在输出结果中使用它吗? @NathanOliver 我正在尝试创建一个数独求解算法,这意味着只会出现数字 1-9。然而,我会在未来的项目中考虑到这一点。感谢您的回答!【参考方案2】:

对不起,在这里添加新的答案。 NathanOliver 给出了准确的答案。 但是为了好玩,如果我必须编写自己的函数来实现它,我在数组而不是向量上尝试了它(因为更改向量的代码将是一项微不足道的任务)。

在此处添加我的代码 sn-p。

#include<iostream>

using namespace std;

int arr1[]=2,3,6,10;
int arr2[]=3,5,7,9,10;

int result[10];
int result_size=0;

void getUncommonValues(int *arr1, int size1, int *arr2, int size2)
    if ( (size1 == 0) && (size2 == 0) )
        return;

    if( size1 == 0)
        result_size=size2;
        for (int i=0; i < size2; i++)
            result[i] = arr2[i];
    

    if (size2 == 0)
        result_size=size1;
        for (int i=0; i < size1; i++)
            result[i] = arr1[i];
    

    int i1=0, i2=0;
    while (size1 > i1)
        if ( arr1[i1] < arr2[i2])
            result[result_size++] = arr1[i1++];
         else
            if ( arr2[i2] < arr1[i1] )
                result[result_size++] = arr2[i2++];
            else
                i1++; i2++;
            
        
        if ( i2 == size2 )
            for ( ; i1 < size1; i1++)
                result[result_size++] = arr1[i1];
        
    

    for ( ; i2 < size2 ; i2++)
        result[result_size++] = arr2[i2];
    


int main()
    getUncommonValues(arr1,sizeof(arr1)/sizeof(int), arr2,sizeof(arr2)/sizeof(int));
    for (int i =0; i<result_size; i++)
        cout << result[i] <<" ,";

    cout << endl;
    return 0;

注意:这里的结果存储在全局数组中,并且大小固定。 这可以直接在向量中解决。

【讨论】:

以上是关于如何比较 2 个向量并根据比较创建单独的向量的主要内容,如果未能解决你的问题,请参考以下文章

比较 2 个向量并从第 2 个向量中删除第 1 个中找不到的元素 - c++ [关闭]

如何创建二维字符串向量并在其中插入数据?

按块比较两个向量时如何避免重复

如何根据不同的向量创建重复字符串的向量

如何通过词向量技术来计算2个文档的相似度?

将MFCC特征向量与DTW进行比较