11
votes

Vérification si une chaîne est présente sous forme d'élément dans un vecteur

Quel est le moyen le plus efficace de vérifier si un vecteur stl de chaînes contient une chaîne spécifique?


1 commentaires

Si la vérification de la présence d'un élément de votre conteneur est quelque chose que vous envisagez de devoir faire souvent, vous voudrez peut-être envisager d'utiliser un STD :: Set à la place (en fournissant bien sûr que vous ne voulez pas de cordes en double dans votre ensemble). STD :: Set a une méthode de recherche () pour laquelle la complexité moyenne est garantie pour être journal (n).


5 Réponses :


20
votes

La solution évidente mais éventuellement trop lente est std :: Recherche (Vec.begin (), Vec.end (), votre_string);

Si votre vecteur ne change pas beaucoup, triez-la d'abord, puis utilisez binary_search , inférieur_bound , upper_bound ou égal_range . Si votre vecteur change beaucoup, envisagez d'utiliser un SET / (ou si nécessaire mappe / multimap ) .

Selon vos besoins, un hachage ( Unorded_sed_sed_sed ) pourrait également être approprié, mais il est plus différent de votre choix de conteneur initial que des conteneurs commandés normaux et non fournis avant C ++ 0x (vous peut l'obtenir de boost facilement).


2 commentaires

Ou un multiiset si la valeur peut exister plus d'une fois.


Plus rapide peut encore être une table de hachage, ou un arbre de préfixe (Aka Trie). Le premier est plus ou moins standard: Unorded_set en C ++ 0x (également disponible dans Boost) ou hash_set dans l'ancienne STL. Vous devrez peut-être écrire votre propre version de ce dernier ou rechercher une bonne implémentation.



0
votes

Utiliser std :: Recherche pour trouver la chaîne.

std::find(stringVector.begin(), stringVector.end(), "specificStringToFind") ;


0 commentaires

3
votes
vector<string> v;
vector<string>::iterator it;
it = std::find(v.begin(), v.end(), "stringToFind");

0 commentaires

10
votes

Utiliser std :: Trouver code> pour trouver la chaîne cible. Ceci est une recherche linéaire, alors méfiez-vous de gros vecteurs de gros vecteurs.

Pour savoir si le vecteur contient la cible ou non, utilisez: P>

bool isPresent = (std::find(vec.begin(), vec.end(), target) != vec.end());


0 commentaires

4
votes

Voici une alternative C ++ 11:

[](std::string const& s) {return s.size()>3;}


4 commentaires

Il existe des algorithmes spécifiques pour cela dans la STL. Pourquoi utiliser une Lamda générique pour cela quand il y a une meilleure alternative?


Parce que (i) comme mentionné, il est extensible, (ii) l'obtention d'un bool est imo plus agréable que de remettre en question les itérateurs et (iii) c'est une alternative à l'autre réponse que tous indiquent le même concept ... je n'ai pas dit que c'est le plus efficace.


Ok, je viens de reconnaître que la question a explicitement demandé l'efficacité. Comme dit, je ne sais pas comment il se compare comparé à std :: Trouver , mais cela pourrait toujours être utile.


En fait, cela m'a aidé même s'il était inefficace pour le cas de l'OP.