gpt4 book ai didi

c++ - std::vector::resize() 与 std::vector::reserve()

转载 作者:IT老高 更新时间:2023-10-28 12:12:17 31 4
gpt4 key购买 nike

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是对还是错?

最佳答案

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

std::vector::reserve 将分配内存,但不会调整 vector 的大小,其逻辑大小与以前相同。

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

保留后,在您的情况下,您将需要大量 push_backs 才能写入元素 5。如果您不想这样做,那么在您的情况下,您应该使用调整大小。

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

关于c++ - std::vector::resize() 与 std::vector::reserve(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13029299/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com