2008-10-06 45 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

无论您发布做任何内存释放代码片段,所以他们大致相等。

其他人发布的交换技巧将花费更长的时间执行,因为它会释放该向量最初使用的内存。这可能会也可能不会是理想的。