В качестве аргумента функции я получаю 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);
Это имеет то преимущество, что и ваш вектор действительно сжимается. (В вашем первом примере clear() не гарантирует сжатия вашего вектора.)
Правда, извините, я принял это как должное (поскольку я рассматриваю clear () как частный случай resize ()). :-)
Это нестандартный C++ - swap принимает неконстантную ссылку, которая не привязывается к временному вектору. Visual C++ допускает это как расширение языка.
Пытался, но это не удалось скомпилировать по причине, указанной Джеймсом Хопкиным.
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 - это компромисс между удержанием большего количества памяти, чем требуется, и выполнением перераспределения.
Что ж, давайте разберемся, как это сделать :)
vec.swap(std::vector<double>(n));
std::vector<double>(n).swap(vec);
std::swap(vector<double>(n), vec);
std::swap(vec, vector<double>(n));
Последние два не дают желаемого эффекта, по крайней мере, при реализации std :: swap по умолчанию. :-)
На самом деле это так :) std :: swap перегружен в векторе и вызывает функцию-член. Этого требует стандарт.
Ни один из опубликованных вами фрагментов кода не освобождает память, поэтому они примерно равны.
Уловка подкачки, которую все остальные публикуют, займет больше времени, потому что она освободит память, изначально используемую вектором. Это может быть или нежелательно.
Вы могли бы, чтобы resize () не уменьшал векторную емкость.