(Re) inicializar um vector para um certo comprimento com valores iniciais
-
05-07-2019 - |
Pergunta
Como um argumento da função recebo uma vector<double>& vec
(um vetor de saída, portanto, não-const) com valores de comprimento e desconhecido. Eu quero inicializar este vector a um comprimento específico n com todos os zeros.
Este trabalho irá
vec.clear();
vec.resize( n, 0.0 );
E isso vai funcionar tão bem:
vec.resize( n );
vec.assign( n, 0.0 );
É a segunda mais eficiente (porque nenhum desalocação de memória / alocação está envolvido)? Existe uma maneira mais eficiente de fazer isso?
Solução
std::vector<double>(n).swap(vec);
Depois disso, VEC está garantido para ter tamanho e capacidade n, com todos os valores 0.0.
Talvez a maneira mais idiomática desde C ++ 11
vec.assign(n, 0.);
vec.shrink_to_fit();
com a segunda opcional line. No caso em que vec
começa com mais do que elementos n
, seja para shrink_to_fit
chamada é um trade-off entre a reter mais memória do que é exigido vs realizar uma re-alocação.
Outras dicas
std::vector<double>(n).swap(vec);
Isto tem a vantagem de realmente compactar seu vetor também. (Em seu primeiro exemplo, clear()
não garante a compactar seu vetor.)
rodada do poço deixou as maneiras de fazer isso:)
vec.swap(std::vector<double>(n));
std::vector<double>(n).swap(vec);
std::swap(vector<double>(n), vec);
std::swap(vec, vector<double>(n));
Nenhum dos trechos de código que você postou fazer qualquer desalocação de memória, por isso são mais ou menos igual.
O truque de swap que todo mundo mantém postagem vai demorar mais tempo para executar, porque ele vai desalocar a memória originalmente usado pelo vetor. Isto pode ou não ser desejável.