Quelle est l'efficacité de la fonction find () sur la classe std :: map? Est-ce qu'il parcourt tous les éléments à la recherche de la clé telle que c'est O (n), ou est-ce dans un arbre équilibré, ou utilise-t-il une fonction de hachage ou quoi?
Log (n) Il est basé sur un arbre rouge noir.
Edit: n est bien sûr le nombre de membres sur la carte.
std::map
et std::set
sont implémentés par les éditeurs de compilateurs à l'aide d'arbres de recherche binaires très équilibrés (par exemple, arbre rouge-noir, arbre AVL).
Comme l'a correctement indiqué David, find
prendrait O (log n), où n est le nombre d'éléments dans le conteneur.
Mais c'est avec des types de données primitifs comme int
, long
, char
, double
etc., pas avec des chaînes.
Si std:string
, disons de la taille 'm', est utilisé comme clé, la traversée de la hauteur de l'arbre de recherche binaire équilibrée nécessitera un log n comparaisons de la clé donnée avec une entrée de l'arbre.
Quand std::string
est la clé du std::map
ou std::set
, find
et insert
les opérations coûteront O (m log n), où m est la longueur de la chaîne donnée qui doit être trouvée.
Il n'itère pas tous les éléments, il effectue une recherche binaire (qui est O (log (n))). Il utilise l'opérateur <ou un comparateur pour effectuer la recherche.
Si vous voulez une carte de hachage, vous pouvez utiliser un std :: unordered_map (ajouté sur C++ - 0x), qui utilise une fonction de hachage et en moyenne (en fonction de la fonction de hachage et des données que vous fournissez) find () sera O (1 ).