Il est exact que la norme ne fait pas état de ce que la complexité de la liste::size() doit être - toutefois, il ne recommander qu'il "aurait constante de la complexité" (à Noter qu'Un Tableau 65).
Voici un article intéressant par Howard Hinnant qui explique pourquoi certaines personnes pensent que liste::size() doit avoir O(N) la complexité (essentiellement parce qu'ils croient que O(1) liste::size() rend la liste::splice() ont O(N) la complexité) et pourquoi un O(1) liste::size() est une bonne idée (dans l'opinion de l'auteur):
Je pense que les points principaux dans le document sont les suivants:
- il y a peu de situations où le maintien d'un compte interne de sorte
list::size()
peut être: O(1) des causes de la jonction, une fonction linéaire
- il y a probablement beaucoup plus de situations où une personne pourrait ne pas être conscients des effets négatifs qui pourraient survenir en raison de qu'ils appellent un O(N)
size()
(comme le son d'un exemple où l' list::size()
est appelée lors de la tenue d'une serrure).
- qu'au lieu de permettre à
size()
O(N), dans l'intérêt de la "moindre surprise", la norme devrait exiger de tout récipient qui implémente size()
pour la mettre en œuvre dans un O(1) de la mode. Si un conteneur ne peut pas faire cela, il ne faut pas mettre en oeuvre size()
à tous. Dans ce cas, l'utilisateur du conteneur sera mis au courant qu' size()
n'est pas disponible, et s'ils veulent ou ont besoin pour obtenir le nombre d'éléments dans le conteneur ils peuvent toujours utiliser container::distance( begin(), end())
pour obtenir cette valeur, mais ils doivent être pleinement conscients du fait que c'est un O(N) opérations.
Je pense que j'ai tendance à être d'accord avec la plupart de son raisonnement. Cependant, je n'aime pas sa proposition d'ajout à l' splice()
des surcharges. Avoir à passer une n
qui doit être égale à distance( first, last)
pour obtenir le comportement correct semble être une recette pour les difficile à diagnostiquer des bugs.
Je ne suis pas sûr de ce que devrait ou pourrait être fait aller de l'avant, comme tout changement aurait un impact significatif sur le code existant. Mais en l'état actuel, je pense que le code existant est déjà des répercussions sur le comportement peuvent être sensiblement différentes d'une application à une autre pour quelque chose qu'il aurait été bien définie. Peut-être onebyone du commentaire à propos de la taille mise en cache " et marqué connu/inconnu pourrait bien fonctionner - vous obtenir amorti O(1) le comportement - la seule fois que vous obtenez O(N) le comportement est quand la liste est modifiée par certains splice() opérations. La bonne chose à ce sujet est qu'il peut être fait par des réalisateurs d'aujourd'hui, sans un changement de la norme (à moins que je suis absent quelque chose).
Pour autant que je sais, C++0x n'est pas de changer quoi que ce soit dans ce domaine.