Quel est le moyen le plus efficace de vérifier si un vecteur stl de chaînes contient une chaîne spécifique? p>
5 Réponses :
La solution évidente mais éventuellement trop lente est Si votre vecteur ne change pas beaucoup, triez-la d'abord, puis utilisez Selon vos besoins, un hachage ( std :: Recherche (Vec.begin (), Vec.end (), votre_string); Code> P>
binary_search code>,
inférieur_bound code>,
upper_bound code> ou
égal_range code>. Si votre vecteur change beaucoup, envisagez d'utiliser un
SET code> /
(ou si nécessaire
mappe code> /
multimap code>) . p>
Unorded_sed_sed_sed code>) 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). P>
Ou un multiiset code> 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 code> en C ++ 0x (également disponible dans Boost) ou
hash_set code> dans l'ancienne STL. Vous devrez peut-être écrire votre propre version de ce dernier ou rechercher une bonne implémentation.
Utiliser std :: Recherche pour trouver la chaîne.
std::find(stringVector.begin(), stringVector.end(), "specificStringToFind") ;
vector<string> v; vector<string>::iterator it; it = std::find(v.begin(), v.end(), "stringToFind");
Utiliser Pour savoir si le vecteur contient la cible ou non, utilisez: P> 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.
bool isPresent = (std::find(vec.begin(), vec.end(), target) != vec.end());
Voici une alternative C ++ 11:
[](std::string const& s) {return s.size()>3;}
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 code>, mais cela pourrait toujours être utile.
En fait, cela m'a aidé même s'il était inefficace pour le cas de l'OP.
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).