Considérez le code suivant:
[] [0, <empty>] [0, 1] [0, 1, 2, <empty>, <empty>, <empty>, <empty>, <empty>] [0, 1, 2, 3, <empty>, <empty>, <empty>, <empty>] [0, 1, 2, 3, 4, <empty>, <empty>, <empty>] etc...
3 Réponses :
Le même problème est confronté à toute langue prenant en charge des conteneurs réculativables dynamiques. Ils allouent presque invariablement des morceaux à la fois pour minimiser les allocations et les relogements. P>
En fait, la documentation de VEC < / a> dit autant. Réservez Méthode Par exemple: p>
réserve la capacité de au moins plus d'éléments supplémentaires à insérer dans la VEC donnée. La collection peut réserver plus d'espace pour éviter les rétroglocations fréquentes. P> blockQuote>
L'algorithme réel utilisé n'est pas documenté dans la documentation STD (que je pouvais trouver), mais vous pouvez voir la mise en œuvre dans le code source de la bibliothèque STD, dans le module Raw_Vec, fonctionner GROW_AMORTISTÉS . La taille est doublée à chaque fois que le vecteur doit être cultivé, dans la plupart des cas. P>
Si vous savez à l'avance, quelle est la taille de la VEC, vous pouvez éviter les frais généraux du redimensionnement en appelant VEC :: with_capacity . p>
Au fait, VEC illustre la manière dont les règles de sécurité de la rouille sont importantes. Si vous deviez faire une référence à un élément de la VEC, et tout en maintenant cette référence, vous avez déclenché une réaffectation, la référence indiquerait à l'ancien emplacement et donc invalide. Grâce au vérificateur emprunté, et le fait que si vous avez un emprunt mutable de la VEC, vous ne pouvez pas avoir d'autres emprunts, le compilateur ne vous laisserait pas faire cette erreur. P>
La documentation sur Vec dit Ceci : < / p>
VEC ne garantit pas une stratégie de croissance particulière lorsque réaffecter à son plein, ni lorsque la réserve est appelée. Le courant La stratégie est basique et elle peut s'avérer souhaitable d'utiliser une non-constante facteur de croissance. Quelle que soit la stratégie utilisée de la garantie de la garantie O (1) poussée amortise. p> blockQuote>
La garantie d'amortissement O (1) Push implique que la rouille ne réaffecte pas à chaque poussée. Il doit ressembler davantage au deuxième scénario que vous avez décrit, où il alloue une capacité supplémentaire à faire de la place pour que des éléments supplémentaires soient poussés. P>
Si nous creusons un peu dans le code source de la bibliothèque standard de rouille, nous verrons que dans cette situation (poussant un élément à la fois), la mise en œuvre actuelle de la VEC en fait double la capacité de la VEC sur chaque réaffectation. Bien entendu, cette stratégie exacte n'est pas spécifiée et pourrait changer dans les futures implémentations. P>
Si vous savez dès le début, quelle est la taille de votre VEC, vous pouvez le construire avec 0 commentaires
La stratégie n'est pas spécifiée et pourrait changer à l'avenir. La stratégie actuelle consiste à Notez qu'il s'agit d'un détail de mise en œuvre et peut changer. En fait, Cela a changé récemment . P> VEC code> a une longueur et une capacité. La capacité est le nombre d'éléments que le
VEC code> peut stocker sans réaffecter. Lorsque la capacité est atteinte et qu'un nouvel élément est poussé, la capacité est augmentée et le
VEC code> est réaffecté. P>
VEC :: Nouveau (nouveau () code> ne pas allouer, mais poussant un élément pour la première fois alloue suffisamment d'espace pour un maximum de 8 éléments: P>
bool code> ou
u8 code>), la capacité est définie sur 8, soit 64 bits li>