(ré) initialiser un vecteur à une certaine longueur avec des valeurs initiales
-
05-07-2019 - |
Question
En tant qu'argument de fonction, j'obtiens un vector<double>& vec
(vecteur de sortie, donc non constant) de longueur et de valeurs inconnues. Je souhaite initialiser ce vecteur à une longueur spécifique n avec tous les zéros.
Cela fonctionnera
vec.clear();
vec.resize( n, 0.0 );
Et cela fonctionnera aussi bien:
vec.resize( n );
vec.assign( n, 0.0 );
La seconde est-elle plus efficace (parce qu'aucune désallocation / allocation de mémoire n'est impliquée)? Y a-t-il un moyen plus efficace de le faire?
La solution
std::vector<double>(n).swap(vec);
Ensuite, il est garanti que vec a la taille et la capacité n, avec toutes les valeurs 0.0.
Peut-être que la manière la plus idiomatique depuis C ++ 11 est
vec.assign(n, 0.);
vec.shrink_to_fit();
avec la deuxième ligne facultative. Dans le cas où vec
commence avec plus de n
éléments, le fait d'appeler shrink_to_fit
est un compromis entre conserver plus de mémoire que nécessaire ou effectuer une réallocation.
Autres conseils
std::vector<double>(n).swap(vec);
Cela présente également l’avantage de compacter votre vecteur. (Dans votre premier exemple, clear()
ne garantit pas de compacter votre vecteur.)
Eh bien, arrondissons les moyens 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));
Aucun des extraits de code que vous avez publiés ne fait de désallocation de mémoire, ils sont donc à peu près égaux.
L’astuce d’échange que tout le monde continue de publier prendra plus de temps, car elle désallouera la mémoire utilisée à l’origine par le vecteur. Cela peut être souhaitable ou non.