首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >std::vector::resize()与std::vector::reserve()

std::vector::resize()与std::vector::reserve()
EN

Stack Overflow用户
提问于 2012-10-23 19:19:35
回答 5查看 62.2K关注 0票数 87

this post的评论部分有一个关于使用std::vector::reserve()std::vector::resize()的帖子。

以下是原始代码:

代码语言:javascript
复制
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的调试版本中“崩溃”:

代码语言:javascript
复制
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    v.reserve(10);
    v[5] = 2;

    return 0;
}

我是对的,还是我错了?VS2010 SP1是对的,还是错的?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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]指针可能不再有效。

票数 126
EN

Stack Overflow用户

发布于 2012-10-23 19:28:56

这取决于你想做什么。reserve不会向vector添加任何元素;它只更改capacity(),这保证添加的元素不会重新分配(例如,使迭代器无效)。resize会立即添加元素。如果要在以后添加元素(insert()push_back()),请使用reserve。如果您想在以后访问元素(使用[]at()),请使用resize。所以你的MyClass::my_method可以是:

代码语言:javascript
复制
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 );
    }
}

代码语言:javascript
复制
void MyClass::my_method()
{
    my_member.resize( n_dim );
    for ( int k = 0; k < n_dim; ++ k ) {
        my_member[k] = k;
    }
}

您选择哪一个是一个品味问题,但是您引用的代码显然是不正确的。

票数 13
EN

Stack Overflow用户

发布于 2015-07-08 05:32:38

也许应该讨论一下何时调用这两个方法的数值小于当前向量的大小。

使用小于容量的数字调用reserve()不会影响大小和容量。

使用小于当前大小的数字调用resize(),容器将减少到该大小,从而有效地销毁多余的元素。

总而言之,resize()会释放内存,而reserve()不会。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13029299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档