我正在考虑创建一个比较2个向量(v1
,v2
)的算法,并创建一个新的向量v3
,它将保存v1
之间未共享的值1}}和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;
}
矢量将始终排序。
答案 0 :(得分:6)
如果在示例中,范围已排序,则可以使用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
答案 1 :(得分:0)
很抱歉在这里遇到麻烦并添加新答案。 NathanOliver给出了精确的答案。 但是为了好玩,如果我必须编写自己的函数来实现它,我在数组而不是向量上尝试它(用于更改向量的代码将是一项微不足道的任务)。
在此处添加我的代码段。
#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;
}
注意:此处结果存储在全局数组中并具有固定大小。 这可以直接在矢量中解决。