Est std::string taille() O(1) opération?
Est std::string taille() O(1) opération?
La mise en œuvre de la STL que j'utilise est celui qui est intégré dans VC++
Vous devez vous connecter pour publier un commentaire.
Est std::string taille() O(1) opération?
La mise en œuvre de la STL que j'utilise est celui qui est intégré dans VC++
Vous devez vous connecter pour publier un commentaire.
Si vous vous demandez si MSVC de la mise en œuvre de string::size() a constante de la complexité, alors la réponse est oui. Mais Ne Wakefield mentionné Tableau 65 23,1 de la Norme C++ où il est dit que la complexité de
size()
devrait suivre ce qui est dit dans la Note de l'Un". La Note A dit:Toutefois, cela ne signifie pas que ces entrées est avez constante de la complexité. Les normes d'utilisation très spécifique de la terminologie, et "devrait" signifie qu'il n'est pas obligatoire.
Note de l'Un' a été ajouté à la norme spécifiquement pour apaiser ceux qui ont cru que
size()
devraient être autorisés à avoir linéaire de la complexité de sorte qu'il ne serait pas nécessaire de garder la taille lorsque les conteneurs ont été modifiés.De sorte que vous ne pouvez pas compter sur
size()
ayant constante de la complexité, mais je suis franchement pas sûr que s'il y a des implémentations qui n'ont pas une constantestring::size()
.(end() - begin())
. Ceci est garanti pour être [amorti] O(1) car les deuxbegin()
etend()
doit être O(1) (Conteneur), chaîne itérateurs sont en accès aléatoire (string) etoperator-
doit être O(1) pour les itérateurs qui le prennent en charge (itérateur exigences).O(1)
n'est pas une exigence pour tous conteneurs ne signifie pas qu'il peut êtreO(N)
dans les conteneurs, seulement qu'il peut y avoir au moins un conteneur pour lequel il est non constante, par exemplestd::list<>
.std::string
exigences de l'interdit cependant (ce qui semble impliquer des indices de tableaux peuvent ne plus être en O(1)).std::basic_string<>::size()
il désigne le récipient contenant les exigences (c'est à dire recommandé de taille constante), dans le 11 standard, la condition est explicite: la Complexité: constante de temps.basic_string
est conforme aux exigences d'une Séquence, comme indiqué dans (23.1.1)", et une Séquence est un type de conteneur (23.1.1/1), et un récipient mandats constante de tempsbegin()
etend()
(Tableau 65 23,1) Heureux d'entendre, ils l'ont fait explicite en C++11.Voici un moyen facile de répondre à cette question pour msvc++.
Écrire un peu de code dans un projet:
Hilight l' .la taille de l'appel, cliquez-droit, aller à la définition.
Sur mon installation (vs2005sp1) il m'envoie xstring:1635, qui ressemble à ceci:
Donc il semble que la chaîne a un membre appelé _Mysize, et il est juste de retour que.
En d'autres mots, c'est un O(1) la mise en œuvre.
Oui, std::string::size() est O(1).
Voir Tableau 65 dans l'Article 23.1 de la Norme. "une.taille()" est répertorié comme "(Note A)", qui dit que "les entrées ... doit avoir de la constante de la complexité".
Article 21.3 dit que les chaînes sont conformes aux exigences d'une séquence (23.1), ipso facto, de la taille() est la constante de temps.
Pour une chaîne de caractères, la
size()
opération a être constante pour l'ensemble de la chaîne des implémentations ne pas utiliser cordes(1). Il n'y a aucune exigence explicite dans la norme qui exige que l'opération soitO(1)
, le plus proche est le générique de l'exigence que lessize()
devrait être à temps constant, mais qui laisse de la place pour tout les autres de la complexité de la mesure.Alors pourquoi doit il O(1)?
Ceci vient du fait que la taille ne peut pas être calculée à partir du contenu de la chaîne elle-même. Alors qu'en C, vous utilisez un NUL de terminaison pour déterminer la fin de la chaîne, en C++ NUL est aussi valable que n'importe quel autre caractère dans la chaîne. Puisque la taille de la chaîne ne peut pas être calculée à partir du contenu(2), il doit être manipulé de l'extérieur, indépendamment de la taille réelle de la chaîne.
(1) C++03 standard permet une mise en œuvre à utiliser cordes que la mise en œuvre pour les cordes, mais le fait est qu'aucun des implémentations actuelles de la norme bibliothèques de les utiliser.
(2) Si la mise en œuvre utilisé des cordes, l'opération dépend de la taille par le nombre de blocs à partir de laquelle la corde a été construit si les blocs étaient liés par une liste chaînée ou similaire construire, ou s'ils ont été autorisés à avoir des tailles différentes. Mais cordes ne sont pas utilisés dans toute la bibliothèque standard de mise en œuvre, que je sache.
Rendement est garanti par le TSL d'être au moins O(N) pour les conteneurs, cependant, de nombreux conteneurs, y compris std::string peut mettre en œuvre ce que O(1) et de la volonté. Habituellement, il va renvoyer une variable simple ou de faire quelque chose comme _End - _Begin et de retour que.
Donc finalement peut-être comme cela, mais vous ne pouvez jamais être sûr.