如何比较 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
来保存 v1
和 v2
之间未共享的值。
#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;
向量总是被排序的。
【问题讨论】:
v1
和 v2
是否必须排序?如果是这样,您可能可以在循环中使用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 个向量并根据比较创建单独的向量的主要内容,如果未能解决你的问题,请参考以下文章