(重新)将向量初始化为具有初始值的特定长度

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 都没有进行任何内存释放,因此它们大致相等。

其他人一直发布的交换技巧将需要更长的时间来执行,因为它会释放向量最初使用的内存。这可能是可取的,也可能是不可取的。

【讨论】:

以上是关于(重新)将向量初始化为具有初始值的特定长度的主要内容,如果未能解决你的问题,请参考以下文章

处于释放模式时,C ++向量未初始化为空

如何初始化(或分配)具有特定默认值的结构(抽象数据类型)成员的值

如何在可配置计数的静态结构数组中初始化具有特定值的成员? [复制]

如何将二维数组的所有元素初始化为java中的任何特定值

xstate:如何将状态初始化为特定节点?

初始化具有大小的对象向量时出错