我有一个函数,它接受int *
并修改传入的数组。我提前知道它将访问多少元素。让我们说m
值。
如果我在reserve(m)
上调用vector<int>
然后将指针data()
发送给该函数,会发生什么?
我的猜测是,如果我随后从指针访问数据,就像它是一个数组那样可能工作,但如果我试图使用{从矢量中检索这些数据{1}}矢量的大小不会更新,我会遇到问题。所以我应该使用operator []
来做到这一点。
答案 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
构造函数来设置构造的大小。