std :: vector :: reserve是否重新分配内部数组?

时间:2012-03-04 14:36:50

标签: c++ stl vector

我有一个函数,它接受int *并修改传入的数组。我提前知道它将访问多少元素。让我们说m值。

如果我在reserve(m)上调用vector<int>然后将指针data()发送给该函数,会发生什么?

我的猜测是,如果我随后从指针访问数据,就像它是一个数组那样可能工作,但如果我试图使用{从矢量中检索这些数据{1}}矢量的大小不会更新,我会遇到问题。所以我应该使用operator []来做到这一点。

4 个答案:

答案 0 :(得分:4)

不要这样做;它是未定义的行为,根本不允许。相反,您应该执行几乎同样昂贵的resize()操作,然后传递data()指针。

唯一增加的成本来自内存归零。遗憾的是,没有标准库容器可以处理未初始化的动态存储空间std::unique_ptr<int[]>(new int[m])。但是,归零的成本非常小(但它可能在概念上很烦人,因为你知道你要覆盖数据)。我想在高性能环境中你可以尝试使用独特指针方法。 (请注意,基本类型的数组 - new[]通常完全等同于::operator new()malloc())。

答案 1 :(得分:1)

正确,reserve(m)对空向量只是保证下一个m push_back()不会触发重新分配。向量的大小仍然为0,禁止写入分配的数据。

此处调用resize(m)是正确的方法。

答案 2 :(得分:0)

void reserve ( size_type n );

当当前容量小于 n 时,它仅重新分配内部数组。

答案 3 :(得分:0)

reserve更改容器的内部大小(以便capacity()现在更大)但数组的size不会增长(size()仍为和通话前一样)。因此,要直接回答您的问题,它会使向量的capacity至少为n,其中n是您为{{1}提供的参数}}

如果reserve足够大(但vector较少),当您致电{{1>时,我不知道是否在capacity结束后访问是未定义的行为在它上面(或size)并通过该指针访问数组。只要您在向量中使用POD类型并且在写入它们之前不读取它们,我认为它不会是未定义的行为。不要尝试使用类类型,因为向量的data()之外的元素将是未初始化的并且使用它们为UB。

这样做是没有意义的,因为当你尝试&v[0]向量上的东西或调用size来实际更新大小时,它会覆盖你颠覆性写入的值。向量。只需使用push_back或使用resize构造函数来设置构造的大小。