2008-10-06 9 views
5

En tant qu'argument de la fonction, j'obtiens un vector<double>& vec (un vecteur de sortie, donc non const) avec une longueur et des valeurs inconnues. Je veux initialiser ce vecteur à une longueur spécifique n avec tous les zéros.(re) initialiser un vecteur à une certaine longueur avec des valeurs initiales

Cela fonctionne

vec.clear(); 
vec.resize(n, 0.0); 

Et cela fonctionnera aussi bien:

vec.resize(n); 
vec.assign(n, 0.0); 

est le deuxième plus efficace (car aucune mémoire désallocation/allocation est impliquée)? Y a-t-il un moyen plus efficace de le faire?

Répondre

9
std::vector<double>(n).swap(vec); 

Après cela, VEC est garantie d'avoir la taille et de la capacité n, avec toutes les valeurs 0.0.

La façon plus idiomatique depuis 11 C++ est

vec.assign(n, 0.); 
vec.shrink_to_fit(); 

avec la deuxième ligne optionnelle. Dans le cas où vec commence avec plus de n éléments, si appeler shrink_to_fit est un compromis entre conserver plus de mémoire que nécessaire vs effectuer une ré-allocation.

+0

Merci pour votre correction --- J'ai mis à jour mon entrée aussi. :-) –

9
std::vector<double>(n).swap(vec); 

Ceci a l'avantage de réellement compacter votre vecteur. (Dans votre premier exemple, clear() ne garantit pas compacter votre vecteur.)

+0

Vous pourriez avoir que redimensionner() ne réduit pas non plus la capacité du vecteur. –

+0

Vraiment, désolé, j'ai pris cela pour acquis (puisque je vois clear() comme un cas particulier de resize()). :-) –

+0

Ceci est non standard C++ - swap prend une référence non-const qui ne se lie pas au vecteur temporaire. Visual C++ permet cela comme une extension de langue. –

3

Eh bien nous arrondissons les façons de le faire :)

vec.swap(std::vector<double>(n)); 
std::vector<double>(n).swap(vec); 
std::swap(vector<double>(n), vec); 
std::swap(vec, vector<double>(n)); 
+0

Les deux derniers n'ont pas l'effet désiré, au moins sous l'implémentation par défaut de std :: swap. :-) –

+1

En fait ça fonctionne :) std :: swap est surchargé en vecteur et appelle la fonction membre. Ceci est requis par la norme. –

2

Aucune des extraits de code que vous avez posté faire une libération de la mémoire, ils sont à peu près égaux.

Le tour d'échange que tout le monde continue de publier sera plus long à exécuter, car il libèrera la mémoire initialement utilisée par le vecteur. Cela peut ou non être souhaitable.