(重新)将向量初始化为具有初始值的特定长度
Posted
技术标签:
【中文标题】(重新)将向量初始化为具有初始值的特定长度【英文标题】:(re)initialise a vector to a certain length with initial values 【发布时间】:2008-10-06 11:52:02 【问题描述】:作为函数参数,我得到一个长度和值未知的vector<double>& vec
(一个输出向量,因此是非常量)。我想将此向量初始化为一个特定的长度 n,全为零。
这会起作用
vec.clear();
vec.resize( n, 0.0 );
这也可以:
vec.resize( n );
vec.assign( n, 0.0 );
第二个效率更高(因为不涉及内存释放/分配)?有没有更有效的方法来做到这一点?
【问题讨论】:
【参考方案1】: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
是在占用比所需更多的内存与执行重新分配之间进行权衡。
【讨论】:
【参考方案2】:std::vector<double>(n).swap(vec);
这也具有实际压缩向量的优点。 (在您的第一个示例中,clear()
不保证压缩您的向量。)
【讨论】:
你可以让 resize() 也不会缩小向量容量。 是的,对不起,我认为这是理所当然的(因为我认为 clear() 是 resize() 的一个特例)。 :-) 这是非标准 C++ - swap 采用不会绑定到临时向量的非常量引用。 Visual C++ 允许将其作为语言扩展。 试过了,但由于詹姆斯霍普金指出的原因,编译失败。【参考方案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));
【讨论】:
最后两个没有达到预期的效果,至少在 std::swap 的默认实现下是这样。 :-) 实际上确实如此:) std::swap 在向量中被重载并调用成员函数。这是标准要求的。【参考方案4】:您发布的代码 sn-ps 都没有进行任何内存释放,因此它们大致相等。
其他人一直发布的交换技巧将需要更长的时间来执行,因为它会释放向量最初使用的内存。这可能是可取的,也可能是不可取的。
【讨论】:
以上是关于(重新)将向量初始化为具有初始值的特定长度的主要内容,如果未能解决你的问题,请参考以下文章
如何初始化(或分配)具有特定默认值的结构(抽象数据类型)成员的值