作为函数参数,我得到一个具有未知长度和值的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