评论区里有一个话题这个帖子 https://stackoverflow.com/a/13017983/1629821关于使用std::vector::reserve()
vs. std::vector::resize()
.
这是原始代码:
void MyClass::my_method()
{
my_member.reserve(n_dim);
for(int k = 0 ; k < n_dim ; k++ )
my_member[k] = k ;
}
我相信将元素写在vector
,正确的做法是调用std::vector::resize()
, not std::vector::reserve()
.
事实上,以下测试代码在 VS2010 SP1 的调试版本中“崩溃”:
#include <vector>
using namespace std;
int main()
{
vector<int> v;
v.reserve(10);
v[5] = 2;
return 0;
}
我是对的,还是错的? VS2010 SP1 是对还是错?
有两种不同的方法是有原因的:
std::vector::reserve
将分配内存,但不会调整向量的大小,向量的逻辑大小将与之前相同。
std::vector::resize
实际上会修改矢量的大小,并用默认状态的对象填充任何空间。如果它们是整数,则它们都为零。
在保留之后,在您的情况下,您将需要大量的push_backs来写入元素5。
如果您不想这样做,那么您应该使用调整大小。
关于保留的一件事:如果您随后使用 push_back 添加元素,直到达到保留的容量,任何现有的引用、迭代器或指向向量中数据的指针都将保持有效。因此,如果我预留 1000 个且我的尺码为 5,则&vec[4]
将保持不变,直到向量有 1000 个元素。之后我可以打电话push_back()
它会工作,但是存储的指针&vec[4]
较早的可能不再有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)