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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top