在this post的评论部分有一个关于使用std::vector::reserve()
与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()
,而不是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是对的,还是错的?
发布于 2012-10-23 19:24:03
有两种不同的方法是有原因的:
std::vector::reserve
将分配内存,但不会调整向量的大小,其逻辑大小与以前相同。
std::vector::resize
实际上会修改矢量的大小,并在默认状态下用对象填充任何空间。如果它们是整数,那么它们将全部为零。
在保留之后,对于您的情况,您将需要大量的push_backs来写入元素5。如果您不希望这样做,那么在您的情况下,您应该使用resize。
关于保留的一件事是:如果您随后使用push_back添加元素,直到达到保留的容量,任何现有的引用、迭代器或指向向量中数据的指针都将保持有效。因此,如果我保留1000,大小为5,&vec[4]
将保持不变,直到向量有1000个元素。在那之后,我可以调用push_back()
,它会工作,但之前存储的&vec[4]
指针可能不再有效。
发布于 2012-10-23 19:28:56
这取决于你想做什么。reserve
不会向vector
添加任何元素;它只更改capacity()
,这保证添加的元素不会重新分配(例如,使迭代器无效)。resize
会立即添加元素。如果要在以后添加元素(insert()
、push_back()
),请使用reserve
。如果您想在以后访问元素(使用[]
或at()
),请使用resize
。所以你的MyClass::my_method
可以是:
void MyClass::my_method()
{
my_member.clear();
my_member.reserve( n_dim );
for ( int k = 0; k < n_dim; ++ k ) {
my_member.push_back( k );
}
}
或
void MyClass::my_method()
{
my_member.resize( n_dim );
for ( int k = 0; k < n_dim; ++ k ) {
my_member[k] = k;
}
}
您选择哪一个是一个品味问题,但是您引用的代码显然是不正确的。
发布于 2015-07-08 05:32:38
也许应该讨论一下何时调用这两个方法的数值小于当前向量的大小。
使用小于容量的数字调用reserve()
不会影响大小和容量。
使用小于当前大小的数字调用resize()
,容器将减少到该大小,从而有效地销毁多余的元素。
总而言之,resize()
会释放内存,而reserve()
不会。
https://stackoverflow.com/questions/13029299
复制相似问题