2008-10-06 46 views
5

作爲函數參數,我得到一個具有未知長度和值的vector<double>& vec(輸出向量,因此是非常量)。我想將這個向量初始化爲具有全零的特定長度n。(重新)初始化一個具有初始值的特定長度的向量

這將工作

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

而且這也能發揮作用:

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

是第二更有效(因爲沒有內存釋放/分配涉及計算)?有沒有更有效的方法來做到這一點?

回答

9
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
std::vector<double>(n).swap(vec); 

這樣做的實際壓制你的載體過的優勢。 (在你第一示例中,clear()不保證壓實你的載體。)

+0

您可能曾調整大小()不縮小向量容量。 – 2008-10-06 12:15:50

+0

確實,對不起,我認爲這是理所當然的(因爲我將clear()看作resize()的一個特例)。 :-) – 2008-10-06 12:17:45

+0

這是非標準的C++ - swap需要一個非const引用,它不會綁定到臨時向量。 Visual C++允許將其作爲語言擴展。 – 2008-10-06 14:40:14

3

那麼讓我們圓了做這個方式:)

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

無論您發佈做任何內存釋放代碼片段,所以他們大致相等。

其他人發佈的交換技巧將花費更長的時間執行,因爲它會釋放該向量最初使用的內存。這可能會也可能不會是理想的。