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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top