作爲函數參數,我得到一個具有未知長度和值的vector<double>& vec
(輸出向量,因此是非常量)。我想將這個向量初始化爲具有全零的特定長度n。(重新)初始化一個具有初始值的特定長度的向量
這將工作
vec.clear();
vec.resize(n, 0.0);
而且這也能發揮作用:
vec.resize(n);
vec.assign(n, 0.0);
是第二更有效(因爲沒有內存釋放/分配涉及計算)?有沒有更有效的方法來做到這一點?
作爲函數參數,我得到一個具有未知長度和值的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));
無論您發佈做任何內存釋放代碼片段,所以他們大致相等。
其他人發佈的交換技巧將花費更長的時間執行,因爲它會釋放該向量最初使用的內存。這可能會也可能不會是理想的。
您可能曾調整大小()不縮小向量容量。 – 2008-10-06 12:15:50
確實,對不起,我認爲這是理所當然的(因爲我將clear()看作resize()的一個特例)。 :-) – 2008-10-06 12:17:45
這是非標準的C++ - swap需要一個非const引用,它不會綁定到臨時向量。 Visual C++允許將其作爲語言擴展。 – 2008-10-06 14:40:14