2011-12-22 37 views
2

我正在用一个向量。出于我的目的,我通常需要它具有(n)个元素,这些元素只能使用index []运算符修改而访问&。使用std :: vector作为可更改的完全填充数组?

在某个点上,我的算法将决定它需要更多的空间,我需要放大这个向量来说...是它的2倍大小。

有没有一种方法可以使尺寸加倍,并且向量中的所有新空间都默认使用向量元素类型初始化?

基本上,我不希望手动插入元素以在容量加倍后填充容量,而是希望将其全部容量填充并在增加后进行默认初始化。据我所知,reserve只保留空间(并且不初始化它中的元素,所以虽然我可以使用它和循环插入,但我希望有一种更好玩的方式)。

所以,我想,与此构造函数创建一个新的载体的类似的效果:

std::vector<MyType> vec(2*oldvec.size(), MyType()); 

除了我想保持这种已经在载体之前,规模扩大了一倍,以及元素。

回答

8
+0

我不能相信我已经忘记了这一点。<倒计时结束时我会接受:p – 2011-12-22 16:35:02

2

尝试vec.resize(newsize, MyType())

0

正如其他答案所述,resize矢量方法会将当前矢量的大小设置为所请求的值。假设指定的大小较大,则会使用提供的默认值的副本填充新的矢量条目。

假设足够的连续空间可用于扩展矢量,这可能比创建新的更大的矢量和复制原始内容更高效。

是否需要将新元素初始化为默认值?如果不是,则可以省去麻烦,并且如果对象不是本机类型,则重复构建默认值的花费,只需将其保留为未初始化状态,直到需要使用向量位置为止。在这种情况下,只需使用reserve方法将更多(未初始化的)存储空间添加到该向量,然后根据需要使用推送/弹出例程向向量添加新值。

+0

不,永远不会读取或写入元素,以避免向量已初始化。这是未定义的,并会导致令人惊讶的行为。 – 2011-12-22 17:18:45

+0

同意。访问未定义的元素很糟糕,根本不是我想要建议的。 – Greg 2011-12-22 18:19:11

+0

你能澄清最后一句话吗?听起来这就是你的建议。 – 2011-12-22 18:44:01