(пере) инициализировать вектор определенной длины с начальными значениями - PullRequest
5 голосов
/ 06 октября 2008

В качестве аргумента функции я получаю vector<double>& vec (выходной вектор, следовательно, неконстантный) с неизвестной длиной и значениями. Я хочу инициализировать этот вектор определенной длины n со всеми нулями.

Это будет работать

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

И это тоже будет работать:

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

Является ли второй более эффективным (поскольку не задействовано освобождение / выделение памяти)? Есть ли более эффективный способ сделать это?

Ответы [ 4 ]

10 голосов
/ 06 октября 2008
std::vector<double>(n).swap(vec);

После этого vec гарантированно будет иметь размер и емкость n со всеми значениями 0.0.

Возможно, более идиоматический способ, так как C ++ 11 это

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

со второй строкой необязательно. В случае, когда vec начинается с более чем n элементов, вызов shrink_to_fit является компромиссом между удержанием большего количества памяти, чем требуется для выполнения перераспределения.

9 голосов
/ 06 октября 2008
std::vector<double>(n).swap(vec);

Это имеет преимущество в том, что фактически сокращает ваш вектор. (В вашем первом примере clear() не гарантирует сжатие вашего вектора.)

3 голосов
/ 07 октября 2008

Хорошо, давайте закроем способы сделать это :) 1001 *

vec.swap(std::vector<double>(n));
std::vector<double>(n).swap(vec);
std::swap(vector<double>(n), vec);
std::swap(vec, vector<double>(n));
2 голосов
/ 07 октября 2008

Ни один из опубликованных вами фрагментов кода не освобождает память, поэтому они примерно равны.

Трюк подкачки, который все остальные публикуют, займет больше времени, потому что он освободит память, первоначально использованную вектором. Это может или не может быть желательным.

...