首页 > 后端开发 > C++ > std::vector::reserve() 与 std::vector::resize():我什么时候应该使用哪个?

std::vector::reserve() 与 std::vector::resize():我什么时候应该使用哪个?

Mary-Kate Olsen
发布: 2024-12-29 13:04:22
原创
320 人浏览过

std::vector::reserve() vs. std::vector::resize(): When Should I Use Which?

理解差异:std::vector::resize() 与 std::vector::reserve()

主题std::vector::reserve() 与 std::vector::resize() 的比较引发了编程社区内的讨论。本文旨在阐明它们在向量操作中的不同作用。

std::vector::reserve()

std::vector::reserve() 分配内存指定数量的元素,但不调整向量本身的大小。该向量保持其原始逻辑大小。当您预计向向量添加元素并希望通过预分配内存来优化性能时,此方法很有用。

std::vector::resize()

std: :vector::resize() 将向量的大小修改为指定的元素数量。如果向量需要扩展,它将分配额外的内存。与 Reserve() 不同,resize() 将所有新元素初始化为其默认值。

示例用法

考虑问题中提供的代码:

void MyClass::my_method()
{
    my_member.reserve(n_dim);
    for (int k = 0; k < n_dim; k++)
        my_member[k] = k;
}
登录后复制

根据回复,这里使用reserve()是不正确的。要正确地将元素写入向量,应该使用 resize():

void MyClass::my_method()
{
    my_member.resize(n_dim);
    for (int k = 0; k < n_dim; k++)
        my_member[k] = k;
}
登录后复制

Visual Studio 2010 SP1 行为

提到的代码的“崩溃”行为Visual Studio 2010 SP1 中的行为与响应中描述的正确行为一致。在调整向量大小之前尝试访问超出向量逻辑大小的元素(在本例中为 my_member[5])会导致未定义的行为。

保留和失效

需要注意的是,使用reserve()然后通过push_back()添加元素可能会使引用、迭代器或指向数据的指针无效。矢量。这是因为 Reserve() 分配内存时没有调整大小,当添加新元素时,它们可能会被放置在不同的位置。

综上所述,std::vector::reserve() 和 std::vector ::resize() 有不同的目的。 Reserve() 预分配内存,而 resize() 修改向量的大小并初始化新元素。了解它们的差异对于有效的向量操作至关重要。

以上是std::vector::reserve() 与 std::vector::resize():我什么时候应该使用哪个?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板