30-seconds-of-cpp项目解析:vector的resize方法详解
概述
在C++标准模板库(STL)中,vector是最常用的动态数组容器之一。resize()
方法是vector类提供的一个非常有用的成员函数,它允许我们动态地调整vector的大小。本文将深入探讨resize()
方法的工作原理、使用场景和注意事项。
resize方法的基本功能
resize()
方法的主要功能是改变vector中元素的数量。它有两种重载形式:
void resize(size_type n)
void resize(size_type n, const value_type& val)
当调用resize()
时,vector会根据参数n的值进行以下操作:
- 如果n小于当前size,vector会被截断,只保留前n个元素
- 如果n大于当前size,vector会扩展,新增的元素会被初始化
- 对于单参数版本,新增元素会被值初始化(对于基本类型如int,会被初始化为0)
- 对于双参数版本,新增元素会被初始化为val的值
详细示例解析
让我们通过一个完整的例子来理解resize()
的行为:
#include <iostream>
#include <vector>
int main() {
// 创建一个空vector
std::vector<int> myVector;
// 第一次resize:扩展到5个元素,默认值为0
myVector.resize(5);
// 此时vector内容:0 0 0 0 0
// 第二次resize:扩展到10个元素,新增元素值为1
myVector.resize(10, 1);
// 此时vector内容:0 0 0 0 0 1 1 1 1 1
// 输出当前vector内容
for (int it : myVector) {
std::cout << it << " ";
}
std::cout << std::endl;
// 第三次resize:缩减到5个元素
myVector.resize(5);
// 此时vector内容:0 0 0 0 0
// 输出缩减后的vector
for (int it : myVector) {
std::cout << it << " ";
}
return 0;
}
关键点解析
-
内存分配:当扩大vector时,
resize()
可能会触发内存重新分配,这会使所有迭代器、指针和引用失效。 -
性能考虑:频繁调用
resize()
可能导致多次内存分配和元素复制,影响性能。如果知道最终需要的大小,最好一开始就预留足够空间(使用reserve()
)。 -
默认值与指定值:单参数版本使用值初始化,对于类类型会调用默认构造函数,对于基本类型会初始化为0。双参数版本允许指定初始化值。
-
缩小操作:当缩小vector时,被移除的元素会被销毁,但capacity(容量)通常不会减少。
实际应用场景
-
预分配空间:在处理已知大小的数据前,可以先
resize()
到合适大小,避免后续多次push_back的开销。 -
动态调整:根据运行时的计算结果调整容器大小。
-
清空替代:
resize(0)
可以清空vector,但不同于clear()
,它不保证释放内存。
注意事项
-
异常安全:如果元素类型的构造函数可能抛出异常,
resize()
不能保证强异常安全。 -
与reserve的区别:
reserve()
只改变容量不改变大小,而resize()
改变大小并可能改变容量。 -
自定义类型:对于自定义类类型,确保有适当的构造函数支持
resize()
操作。
总结
vector::resize()
是一个强大而灵活的工具,正确使用它可以提高代码效率和可读性。理解其内部行为和性能特征对于编写高效的C++代码至关重要。在实际开发中,应根据具体需求选择最合适的容器操作方法。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考