我想用蛮力找到两个数组的并集 理论上它应该可以工作,但由于某种原因,只有第一个数组进入第三个数组(第三个数组用于存储数组 1 和数组 2 中的元素) 第 3 个阵列的大小从 8 个增加到 12
个//find the union of two arrays
#include<iostream>
#include<vector>
using namespace std;
void uniarr(vector<int> &arr1, vector<int> &arr2)
{
int n=arr1.size();
int m=arr2.size();
vector<int> arr3(n+m);
cout<<" arr "<<arr3.size()<<endl;
int count=1;
for (int i = 0; i < n; i++)
{ count=1;
for (int j = 0; j < arr2.size(); j++)
{
if(arr1[i]==arr2[j])
{
if(count==1)
{
arr3.push_back(arr1[i]);
count++;
}
arr2.erase(arr2.begin()+j);
j=j-1;
}
}
if(count==1)
{
arr3.push_back(arr1[i]);
}
}
cout<<" arr "<<arr3.size()<<endl;
for (int i = 0; i < arr3.size(); i++)
{
cout<<" "<<arr3.at(i);
}
}
int main()
{
system("cls");
vector<int> arr1={3,1,4,6};
vector<int> arr2={1,2,5,4};
uniarr(arr1,arr2);
return 0;
}
您有 2 个问题:
-
首先,初始化
arr3
std::vector<int> arr3(n+m); // create a vector of SIZE n+m (with value 0)
它应该是
std::vector<int> arr3; arr3.reserve(std::min(n, m)); // "optimization" to avoid future allocation
-
第二个是你的最后一个
if(count==1) { arr3.push_back(arr1[i]); }
它从
arr2
中找不到的arr1
元素中添加arr3
元素。 您应该删除它。演示
我需要添加额外的 for 循环来添加 arr2 元素
原因:从 arr1 添加元素并删除 arr2 中的公共元素后 ARR2 中只保留唯一元素
此外,我需要为 arr3 保留空间,而不是分配 n+m