我有3个问题的载体。其中两个向量已包含值,例如
v1 = {test1,test2,test3,test4,test5}
v2 = {test1, test2, random}
我想要做的是检查v1中是否存在v2中的任何值,并将该值添加到名为v3的vector中。
所以例如当我遍历v3时,输出应为:random
我还想指出v1和v2的大小可能更大,但v1总是更大。
我只需要有人帮助我,并指出我正确的方向。感谢
还有一种方法我可以做一个检查,让我们说如果v2中的所有值都在v1中这样做,但是如果v2中的任何值不在v2中,那么执行set_difference吗?
答案 0 :(得分:2)
存在一种算法,set_difference
:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
int main() {
std::vector<int> v1 = { 10, 2, 3, 4, 5 };
std::vector<int> v2 = { 2, 4, 666, 1 };
std::sort(begin(v1),end(v1));
std::sort(begin(v2),end(v2));
std::vector<int> v3;
v3.reserve( v2.size() ); // no more than one allocation
std::set_difference( begin(v2), end(v2), begin(v1), end(v1), std::back_inserter(v3) );
for( auto e : v3 )
std::cout << e << ", ";
}
答案 1 :(得分:1)
就我而言,以下功能将会解决:
template<typename T>
vector<T> contain(const vector<T>& v1, const vector<T>& v2)
{
vector<T> v3;
for (int i = 0; i < (int)v2.size(); i++) {
for (int j = 0; j < (int)v1.size(); j++) {
if (v2[i] == v1[j]) v3.push_back(v1[i]);
}
}
return v3;
}
这里我们只是遍历v2的每个条目并检查v1是否包含它,如果是,我们将此值添加到v3。复杂度为n^2
,但如果模板参数具有可比性,则可以通过对向量进行排序来实现n*log(n)
。
答案 2 :(得分:0)
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
std::set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), std::back_inserter(v3));