【发布时间】:2019-12-20 07:59:52
【问题描述】:
我们知道,std::vector 在像std::vector vect(n) 或empty_vect.resize(n) 这样初始化时,不仅分配所需的内存量,而且用默认值初始化它(即调用默认构造函数)。这会导致不必要的初始化,特别是如果我有一个整数数组并且我想用一些无法通过任何向量构造函数提供的特定值填充它。
另一方面,Capacity 会像 empty_vect.reserve(n) 一样在调用中分配内存,但在这种情况下,向量仍然是空的。所以size()返回0,empty()返回true,operator[]产生异常。
现在,请查看代码:
{ // My scope starts here...
std::vector<int> vect;
vect.reserve(n);
int *data = vect.data();
// Here I know the size 'n' and I also have data pointer so I can use it as a regular array.
// ...
} // Here ends my scope, so vector is destroyed, memory is released.
问题是“所以我可以将它用作数组”是否是一个安全的假设?
不管争论,我只是对上述问题感到好奇。无论如何,至于论点:
- 它分配内存并在函数返回时自动释放它
- 代码不会执行不必要的数据初始化(在某些情况下可能会影响性能)
【问题讨论】:
-
所以,你想像
unique_ptr<int[]>一样使用它。如果不需要矢量 API,则使用unique_ptr<int[]>。 -
data()中没有对象,你不能这样使用那个指针。 -
不用
resize,有insert、push_back等。 -
接受的答案是正确的,并且更好地说明了为什么要在 C++20 中执行 OP 想要执行的操作。尽管如此,我相信这个案例比许多人想象的要微妙,事实上即使在 C++03 中也有一种解决方法,请参阅stackoverflow.com/a/69141237/2791230。