(пере) инициализировать вектор определенной длины с начальными значениями

StackOverflow https://stackoverflow.com/questions/173995

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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 является компромиссом между удержанием большего количества памяти, чем требуется, и выполнением перераспределения.

Другие советы

std::vector<double>(n).swap(vec);

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

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

vec.swap(std::vector<double>(n));
std::vector<double>(n).swap(vec);
std::swap(vector<double>(n), vec);
std::swap(vec, vector<double>(n));

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top