假设我有一组vector<int>
:
std::vector<int> a = {2,3,8,4,9,0,6,10,5,7,1};
std::vector<int> b = {6,10,8,2,4,0};
std::vector<int> c = {0,1,2,4,5,8};
我想创建一个新向量,以如下方式将所有输入向量共有的元素输入到新向量中,如下所示:
std::vector<int> abc = {8,2,0,8}; // possible output, order doesn't matter
我已经看到许多问题,询问如何删除重复项,但我希望保留仅 个重复项。
是否存在现有的高效STL算法或结构可以为我做到这一点,还是我需要编写自己的算法?
答案 0 :(得分:5)
如前所述,您可以使用算法set_intersection来做到这一点:
但是您还必须先对vector
进行排序
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
std::vector<int> a = {0,1,2,3,4,5,6,7,8,9,10};
std::vector<int> b = {0,2,4,6,8,10};
std::vector<int> c = {0,1,2,4,5,8};
std::vector<int> temp;
std::vector<int> abc;
std::sort(a.begin(), a.end());
std::sort(b.begin(), b.end());
std::sort(c.begin(), c.end());
std::set_intersection(a.begin(), a.end(),
b.begin(), b.end(),
std::back_inserter(temp));
std::set_intersection(temp.begin(), temp.end(),
c.begin(), c.end(),
std::back_inserter(abc));
for(int n : abc)
std::cout << n << ' ';
}