我试图找到一种简单的方法来检查向量是否是另一个的子集而不排序向量中的元素的顺序。两个向量都包含随机数元素。
std::includes
似乎只适用于排序范围。我怎么能做到这一点?
复制向量。对副本进行排序。然后在副本上使用std::includes
。
template <typename T>
bool IsSubset(std::vector<T> A, std::vector<T> B)
{
std::sort(A.begin(), A.end());
std::sort(B.begin(), B.end());
return std::includes(A.begin(), A.end(), B.begin(), B.end());
}
我的回答是假设当你说“子集”时,你真的在寻找相当于“子串”的东西;也就是说,在搜索过程中维护元素的顺序。
最终,我看不出你怎么能在O(n*m)
以外的地方做到这一点。鉴于此,您可以简单地自己动手:
template <typename T1, typename T2>
bool contains(std::vector<T1> const& a, std::vector<T2> const& b) {
for (typename std::vector<T1>::const_iterator i = a.begin(), y = a.end(); i != y; ++i) {
bool match = true;
typename std::vector<T1>::const_iterator ii = i;
for (typename std::vector<T2>::const_iterator j = b.begin(), z = b.end(); j != z; ++j) {
if (ii == a.end() || *j != *ii) {
match = false;
break;
}
ii++;
}
if (match)
return true;
}
return false;
}
(你可能会对模板参数更有创意。)
这是假设重复无关紧要。因此,如果在向量a中有两个数字99的实例,那么只要向量b至少有一个数字99的实例,那么它将被声明为子集。
bool isSubset(const std::vector<int>& a, const std::vector<int>& b)
{
for (std::vector<int>::const_iterator i = a.begin(); i != a.end(); i++)
{
bool found = false;
for (std::vector<int>::const_iterator j = b.begin(); j != b.end(); j++)
{
if (*i == *j)
{
found = true;
break;
}
}
if (!found)
{
return false;
}
}
return true;
}
没有排序......
template <typename T>
bool isSubsetOrEqual(std::vector<T> const& a, std::vector<T> const& b) {
for(auto const& av:a){
if(std::find(b.begin(),b.end(),av)==b.end())
return false;
}
return true;
}