【问题标题】:How to compare 2 vectors and create a separate vector based on the comparison如何比较 2 个向量并根据比较创建单独的向量
【发布时间】: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

标签: c++ algorithm vector


【解决方案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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2016-07-27
    • 2012-05-21
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多