web-dev-qa-db-fra.com

Comment définir la taille initiale de std :: vector?

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, pour éviter les copies lorsque j'insère de nouvelles)?

109
Damir
std::vector<CustomClass *> whatever(20000);

ou:

std::vector<CustomClass *> whatever;
whatever.reserve(20000);

Le premier définit la taille réelle de la matrice - c’est-à-dire qu’elle en fait un vecteur de 20000 pointeurs. Ce dernier laisse le vecteur vide, mais réserve de l’espace pour 20000 pointeurs, de sorte que vous pouvez insérer (jusqu’à) autant d’entre eux sans devoir le réaffecter.

Au moins, d’après mon expérience, il est assez inhabituel que l’une ou l’autre de ces solutions fasse une énorme différence de performances - mais l’une ou l’autre peut avoir une incidence sur la correction dans certaines circonstances. En particulier, tant qu’aucune réaffectation n’est effectuée, les itérateurs du vecteur conservent leur validité, 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éaffectation tant que vous ne le ferez pas. t augmenter la taille au-delà.

151
Jerry Coffin

Vous devez utiliser la fonction reserve pour définir une taille allouée initiale ou le faire dans le constructeur initial.

vector<CustomClass *> content(20000);

ou

vector<CustomClass *> content;
...
content.reserve(20000);

Lorsque vous reserve() éléments, la vector allouera suffisamment d'espace pour (au moins?) Autant d'éléments. Les éléments n'existent pas dans la vector, mais la mémoire est prête à être utilisée. Cela accélérera éventuellement Push_back() car la mémoire est déjà allouée.

11
user195488