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】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1331
文章版权归作者所有,未经允许请勿转载。
THE END