J'ai un vector<CustomClass*>
et j'ai mis beaucoup d'éléments dans le vecteur et j'ai besoin d'un accès rapide, donc je n'utilise pas de liste. Comment définir la taille initiale du vecteur (par exemple 20 000 places, donc pour éviter la copie lorsque j'en insère un nouveau)?
130
std::vector
référence, en fonction de ce qui correspond le mieux à vos besoins.std::vector
dans le titre?Réponses:
ou:
Le premier définit la taille réelle du tableau, c'est-à-dire en fait un vecteur de 20000 pointeurs. Ce dernier laisse le vecteur vide, mais réserve de l'espace pour 20000 pointeurs, vous pouvez donc en insérer (jusqu'à) autant sans qu'il soit nécessaire de le réallouer.
Au moins d'après mon expérience, il est assez inhabituel que l'un ou l'autre de ces éléments fasse une énorme différence en termes de performances - mais l'un ou l'autre peut affecter l'exactitude dans certaines circonstances. En particulier, tant qu'aucune réallocation n'a lieu, les itérateurs dans le vecteur sont garantis pour rester valides, et une fois que vous avez défini la taille / l'espace réservé, vous êtes assuré qu'il n'y aura pas de réallocations tant que vous ne le faites pas. t augmenter la taille au-delà.
la source
whatever[10000] = somepointer;
, où le dernier vous oblige àpush_back
chaque pointeur que vous ajoutez. Au moins si vous y êtes habituévector
, ce dernier est probablement plus simple et plus naturel.reserve
, qui pré-alloue la taille de la mémoire. En théorie, la définition de la taille pourrait encore être minutieusement plus rapide, car elle évite également d'incrémenter la taille actuelle à chaque fois que vous ajoutez un élément. En réalité, je doute que vous puissiez mesurer cela.Vous devez utiliser la fonction reserve pour définir une taille allouée initiale ou le faire dans le constructeur initial.
ou
Lorsque vous
reserve()
éléments, vousvector
allouerez suffisamment d'espace pour (au moins?) Autant d'éléments. Les éléments n'existent pas dans levector
, mais la mémoire est prête à être utilisée. Cela va alors éventuellement s'accélérerpush_back()
car la mémoire est déjà allouée.la source
std::vector<Custom Class*> content(100);
)