查找vector是否为子向量c ++

时间:2015-06-01 22:07:46

标签: c++ vector

假设我有:

std::vector<string> group;
std::vector<string> subGroup;

关于这两个载体的一些属性:

1)所有元素都是唯一的。

2)他们没有排序,排序不是一种选择。

我需要检查组是否包含子组。如果确实如此,那么我需要返回true,如果它没有返回false。

示例:

group = {&#34; A&#34;,&#34; B&#34;,&#34; C&#34;,&#34; D&#34;},subGroup = {&#34; A&#34;,&#34; D&#34;,&#34; E&#34;} - &gt; answer = false

group = {&#34; A&#34;,&#34; E&#34;,&#34; C&#34;,&#34; D&#34;},subGroup = {&#34; A&#34;,&#34; D&#34;,&#34; E&#34;} - &gt; answer = true

我目前的实施是:

int cont=0;
if(subGroup.size() > group.size())
    return false;
else{
    for(int i=0; i<subGroup.size(); i++){
        for(int j=0; j<group.size(); j++){
            if(subGroup[i] == group[j]{
                cont++;
            }
        }
    }
    if (cont == subGroup.size())
            return true;
    return false;
}

我在这里检查了这篇文章locate sub-vector<string> in another vector<string>,但我不应该使用C ++ 11的功能,而且这个答案并没有解决我的问题(例如,使用我的示例2,它将返回假)。

两件事:我的实施是好还是有任何错误?有没有更简单的方法来实现它使用STL功能或类似的东西?

3 个答案:

答案 0 :(得分:4)

两个最直接的解决方案是:

  • 复制矢量,对其进行排序,然后使用includes
  • 将组的元素复制到setunordered_set,然后检查subgroup的每个元素,看看它是否在集合中(如果是C + +11是一个选项,您可以使用all_of和lambda来实现循环)
    • 同一想法的变体:从set的元素中制作unordered_setsubgroup,然后遍历group的元素,将其从如果存在的话。返回true如果这会清空集合。

在任何一种情况下,要获得合理的最差案例性能保证,如果subgroup的大小超过group,则应立即返回false。

后者unordered_set具有您可能期望的最佳渐近复杂度(即O(n)其中n的大小为group),但我想是第一种选择对于#34;典型的&#34;更有效。实例

答案 1 :(得分:1)

可以使用std::set

std::set<std::string> group ; // Fill it first !

std::vector<std::string> subgroups  {"A","D","E"} ;
std::vector<std::string>::iterator i = subgroups.begin() ;

std::pair<std::set<std::string>::iterator,bool> p;

for( ; i != subgroups.end(); ++i )
{
    p = group.insert( *i );
    if( p.second ) // Present in group
    {
             break;
    }
}

if( i == subgroups.end() )
    std::cout << std::boolalpha << true ;
else
    std::cout << std::boolalpha << false ;

答案 2 :(得分:1)

使用std:find

可以解决此问题的简单方法
bool            in(std::vector<std::string> const &group,
                   std::vector<std::string> const &subGroup) {
  std::size_t const     subSize = subGroup.size();
  int                   i = 0;

  while (i < subSize && std::find(group.begin(), group.end(), subGroup[i]) != group.end()) {
    i++;
  }
  return (i == subSize);
}