如何使用C ++中的STL找到两个数组之间的共同元素?
C++的STL库提供了大量的算法和容器,使开发者的工作更加高效。其中就包括从两个数组中找到共同元素的算法。
假设我们有两个数组:arr1和arr2。
int arr1[] = {10,20,30,40,50};
int arr2[] = {30,40,50,60,70};
我们可以通过以下三种方法找到这两个数组之间的共同元素:
方法一:使用set_intersection
std :: set_intersection是STL算法库的一个函数,可以帮助我们查询两个有序数组之间的公共元素。此函数要求两个数组都必须是有序的。
#include<iostream>
#include<algorithm>
#include<iterator>
using namespace std;
int main()
{
int arr1[] = {10,20,30,40,50};
int arr2[] = {30,40,50,60,70};
int n = sizeof(arr1) / sizeof(int);
int m = sizeof(arr2) / sizeof(int);
cout<<"Common elements: ";
set_intersection(arr1, arr1 + n, arr2, arr2 + m, ostream_iterator<int>(cout, " "));
return 0;
}
运行结果:
Common elements: 30 40 50
方法二:使用std :: map
我们可以使用std :: map来存储一个数组中的元素并计数,然后再对第二个数组进行遍历,通过查看元素计数来找到共同元素。
#include<iostream>
#include<map>
using namespace std;
int main()
{
int arr1[] = {10,20,30,40,50};
int arr2[] = {30,40,50,60,70};
int n = sizeof(arr1) / sizeof(int);
int m = sizeof(arr2) / sizeof(int);
map<int, int> mp;
//fill map with one array
for(int i = 0; i < n; i++)
mp[arr1[i]]++;
cout<<"Common elements: ";
//find common elements
for(int i = 0; i < m; i++)
{
if(mp[arr2[i]] > 0)
{
cout<<arr2[i]<<" ";
mp[arr2[i]]--; //reduce count of element for future
}
}
return 0;
}
运行结果:
Common elements: 30 40 50
方法三:使用std :: unordered_map
如果我们在数组中有任何一种大量的重复元素,如若干个7,则需要使用std :: unordered_map代替上述方法。
#include<iostream>
#include<unordered_map>
using namespace std;
int main()
{
int arr1[] = {7, 14, 7, 7, 21};
int arr2[] = {14, 7, 14, 21};
int m = sizeof(arr1) / sizeof(int);
int n = sizeof(arr2) / sizeof(int);
std::unordered_map<int, int> counter;
for (int i = 0; i < m; ++i)
{
counter[arr1[i]]++;
}
cout<<"Common elements: ";
for (int i = 0; i < n; ++i)
{
if (counter[arr2[i]] != 0)
{
cout<<arr2[i]<<" ";
counter[arr2[i]]--;
}
}
return 0;
}
运行结果:
Common elements: 14 7 21
结论
C++的STL库提供了一些方法来查找两个数组之间的公共元素。我们可以使用set_intersection算法,也可以使用std :: map或std :: unordered_map来完成此任务。选择哪种方法应取决于数组中的元素是否重复以及数组是否按顺序排列。