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

这篇文章的评论部分有一个关于使用 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(),不是 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 是对的,还是错的?

cntong 回答:std::vector::resize() 与 std::vector::reserve()

有两种不同的方法是有原因的:

std::vector::reserve 将分配内存但不会调整向量的大小,向量的逻辑大小与之前相同.

std::vector::resize 实际上会修改向量的大小,并会用处于默认状态的对象填充任何空间.如果它们是整数,则它们都为零.

reserve 之后,在你的情况下,你需要很多 push_backs 来写入元素 5.如果您不想这样做,那么在您的情况下,您应该使用调整大小.

关于保留的一件事:如果您随后使用 push_back 添加元素,直到达到您保留的容量,任何现有的引用、迭代器或指向向量中数据的指针都将保持有效.所以如果我保留 1000 并且我的大小是 5,&vec[4] 将保持不变,直到向量有 1000 个元素.之后,我可以调用 push_back() 并且它会工作,但是之前存储的 &vec[4] 指针可能不再有效.

这篇关于std::vector::resize() 与 std::vector::reserve()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持前端之家!

本文链接:https://www.f2er.com/3188530.html

大家都在问