1.44、vector扩容,resize和reserve的区别

功能区别

  • • resize(new_size)
    • • 改变容器的大小(size),即元素的个数。
    • • 如果new_size大于当前size(),会创建新元素(默认构造或指定值)填充到新的大小。
    • • 如果new_size小于当前size(),会删除多余元素。
    • • 可能触发内存重新分配(容量扩容),使capacity()≥new_size
    • • 调用后,可以通过operator[]访问新增元素。
  • • reserve(new_capacity)
    • • 改变容器的容量(capacity),即为将来扩容预留内存,但不改变当前元素个数(size)。
    • • 不会构造或销毁元素。
    • • 主要用于减少后续push_back等操作导致的多次内存分配,提高性能。
    • • 调用后,不能通过operator[]访问未构造的空间。

内存和访问区别

方面 resize reserve
改变的属性 改变size(元素个数) 改变capacity(预留空间)
是否构造元素 是,新增元素会被构造 否,不构造元素
是否销毁元素 是,减少size时销毁多余元素
是否触发扩容 可能触发扩容 可能触发扩容
是否可访问新增空间 是,可通过operator[]访问 否,空间未构造,访问会越界

使用场景

  • • resize适用场景
    • • 需要调整容器中元素的数量。
    • • 需要直接访问新增元素(如初始化或赋值)。
    • • 例如,预先设定容器大小,直接通过下标访问元素。
  • • reserve适用场景
    • • 预计要插入大量元素,但暂时不需要访问它们。
    • • 通过push_back等方式逐个添加元素,避免多次内存重新分配。
    • • 优化性能,减少内存分配开销。

代码

std::vector<int> v;

// reserve只分配内存,不改变size
v.reserve(100);
std::cout << "size: " << v.size() << ", capacity: " << v.capacity() << std::endl; // size:0, capacity:≥100

// push_back添加元素,size增加
v.push_back(1);
std::cout << "size: " << v.size() << ", capacity: " << v.capacity() << std::endl; // size:1, capacity:≥100

// resize改变size,新增元素被默认初始化
v.resize(5);
std::cout << "size: " << v.size() << ", capacity: " << v.capacity() << std::endl; // size:5, capacity:≥100
std::cout << v[3] << std::endl; // 可以访问新增元素,值为0(int默认值)

总结

  • • resize是调整容器元素数量的接口,会构造或销毁元素,改变size
  • • reserve是预分配内存空间的接口,只改变capacity,不影响size和元素访问。
  • • 正确使用reserve可避免频繁扩容,提高插入效率;resize用于需要改变元素个数和直接访问元素的场景。
    本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
    (加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
THE END