localiser le sous-vecteur dans un autre vecteur

J’ai un vector v1 = {"A","B","C"} . Je veux vérifier si v1 est included dans le vector v2 = {"X","Y","A","B","C","D"} .

  • Puis-je trouver si un ensemble est un sous-ensemble de l’autre en utilisant STL ?
  • Les vecteurs ne doivent pas être sortingés
  • Si le sous-ensemble est trouvé une seule fois, l’algorithme arrête ” if(counter == v1.size()){break;} “. Pensez-vous que je devrais lui permettre de poursuivre la recherche au cas où le sous-ensemble serait répété deux fois?

 #include  #include  #include  using namespace std; float wordOrder ( std::vector v1, std::vector v2 ) { //declare a vector that will be used as an index. If we find the element of v1 in v2 we insert 1 std::vector index ( v2.size(),0 ); int counter = 0; int s = v1.size(); //check if size of v1 less than size of V2 if ( v1.size() <= v2.size() ) { for ( int i = 0; i < v1.size(); i++ ) { for ( int j = 0; j < v2.size(); j++ ) { if ( v1[i]== v2[j]) {index[j] = 1;} } } //loop throught the index vector and check if we have a sequence of 1s for ( int i = 0; i < index.size(); i++ ) { if ( index[i] == 1 ) { for ( int j = i; j < index.size(); j++ ) { if ( index[j] == 1 ) {counter++;} } //if the sequence of 1s = to the size of v1 it means that we have identified the sub-vector if(counter == v1.size()){break;} else{counter = 0; continue;} } } }//end if return counter/(float)v1.size(); } int main() { std::vector v1{"A","B","C"}; std::vector v2{"X","A","B","C","Y"}; cout << wordOrder (v1, v2 ) << endl; return 0; } 

Oui, vous pouvez utiliser la bibliothèque standard. Utilisez std::search pour effectuer une recherche par plage :

 vector v1 = {"A","B","C"}; vector v2 = {"X","Y","A","B","C","D"}; auto res = search(begin(v2), end(v2), begin(v1), end(v1)); 

Et testez si la plage a été trouvée:

 auto found = res != end(v2); 

Exemple en direct ici .

RE: Puis-je trouver si un ensemble est un sous-ensemble de l’autre en utilisant STL?

La réponse à cette question est oui, mais peut-être pas aussi sexy que vous le souhaitez. Vous pouvez utiliser count_if pour parcourir la v2 et fournir un foncteur qui compte combien de fois un sous-ensemble se produit dans ce conteneur. Si le sous-ensemble que vous recherchez apparaîtra toujours dans l’ordre (c’est-à-dire que C suit B suit A sinon il ne compte pas), vous pouvez utiliser search_n () ou search ().

RE: Si le sous-ensemble est trouvé une seule fois, l’algorithme arrête “if (counter == v1.size ()) {break;}”. Pensez-vous que je devrais lui permettre de poursuivre la recherche au cas où le sous-ensemble serait répété deux fois?

Cela dépend de vos besoins. Avez-vous besoin de cette fonctionnalité? Si oui, alors vous devriez le programmer. Si vous ne le faites pas, les fonctionnalités existantes sont suffisantes, plus simples et plus efficaces, donc meilleures.