vector.resize 与 vector.reserve的区别

本文详细解释了C++标准模板库中vector容器的reserve与resize两个成员函数的区别与联系。reserve用于预留内存空间而不创建元素,resize则同时调整容器大小并创建元素。文中还提供了具体的使用示例。

reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。

resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。

再者,两个函数的形式是有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。下面是这两个函数使用例子:

vector<int> myVec; 


myVec.reserve( 100 ); // 新元素还没有构造, 


// 此时不能用[]访问元素 


for (int i = 0; i < 100; i++ ) 


...{ 


myVec.push_back( i ); //新元素这时才构造 


} 


myVec.resize( 102 ); // 用元素的默认构造函数构造了两个新的元素 


myVec[100] = 1; //直接操作新元素 


myVec[101] = 2; 


 






初次接触这两个接口也许会混淆,其实接口的命名就是对功能的绝佳描述,resize就是重新分配大小,reserve就是预留一定的空间。这两个接口即存在差别,也有共同点。下面就它们的细节进行分析。
为实现resize的语义,resize接口做了两个保证:
一是保证区间[0, new_size)范围内数据有效,如果下标index在此区间内,vector[indext]是合法的。
二是保证区间[0, new_size)范围以外数据无效,如果下标index在区间外,vector[indext]是非法的。
reserve只是保证vector的空间大小(capacity)最少达到它的参数所指定的大小n。在区间[0, n)范围内,如果下标是index,vector[index]这种访问有可能是合法的,也有可能是非法的,视具体情况而定。
resize和reserve接口的共同点是它们都保证了vector的空间大小(capacity)最少达到它的参数所指定的大小。
因两接口的源代码相当精简,以至于可以在这里贴上它们:
void resize(size_type new_size) { resize(new_size, T()); }
void resize(size_type new_size, const T& x) {
if (new_size < size()) 
erase(begin() + new_size, end()); // erase区间范围以外的数据,确保区间以外的数据无效
else
insert(end(), new_size - size(), x); // 填补区间范围内空缺的数据,确保区间内的数据有效


### C++ 中 `std::vector` 的 `resize()` 方法详解 `std::vector` 是 C++ 标准模板库(STL)提供的一种动态数组容器,具有自动管理内存的能力。其中,`resize()` 方法用于调整向量的大小,使其包含指定数量的元素。以下是关于该方法的具体说明以及使用示例。 #### 方法签名 `resize()` 支持两种形式: 1. **无初始值填充** ```cpp void resize(size_t count); ``` 参数 `count` 指定新的大小。如果新大小大于当前大小,则新增的元素会被默认初始化;如果是基本数据类型(如 `int`, `float`),则初始化为零[^1]。 2. **带初始值填充** ```cpp void resize(size_t count, const T& value); ``` 参数 `value` 用来设置新增元素的初始值。此版本适用于需要显式赋值的情况[^2]。 --- #### 示例代码 以下是一些常见的使用场景: ##### 场景一:增加向量大小 当调用 `resize()` 并传入更大的尺寸时,`std::vector` 会扩展容量并将新增位置填充值。 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3}; // 初始大小为3 // 扩展到5个元素,默认新增元素为0 vec.resize(5); std::cout << "扩展示例: "; for (const auto& elem : vec) { std::cout << elem << " "; // 输出: 1 2 3 0 0 } std::cout << std::endl; } ``` ##### 场景二:减少向量大小 通过传递较小的数值给 `resize()`,可以裁剪掉超出的部分。 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 缩减至3个元素 vec.resize(3); std::cout << "缩减示例: "; for (const auto& elem : vec) { std::cout << elem << " "; // 输出: 1 2 3 } std::cout << std::endl; } ``` ##### 场景三:自定义新增元素的值 可以通过第二个参数设定新增元素的内容。 ```cpp #include <iostream> #include <vector> int main() { std::vector<std::string> strVec = {"apple", "banana"}; // 添加三个字符串"orange" strVec.resize(5, "orange"); std::cout << "自定义新增值示例: "; for (const auto& str : strVec) { std::cout << str << " "; // 输出: apple banana orange orange orange } std::cout << std::endl; } ``` --- #### 关联之前提到的编译错误 在之前的讨论中提到了一个涉及 `MAX_SIZE` 的编译错误。假设我们希望创建一个固定大小的二维矩阵,并利用 `resize()` 来实现这一目标,如下所示: ```cpp #include <iostream> #include <vector> constexpr size_t MAX_SIZE = 10; int main() { std::vector<std::vector<int>> matrix; // 设置外部维度为 MAX_SIZE matrix.resize(MAX_SIZE); // 设置内部每个子向量也为 MAX_SIZE,且初始化为0 for(auto& row : matrix){ row.resize(MAX_SIZE, 0); } std::cout << "Matrix initialized with size [" << MAX_SIZE << ", " << MAX_SIZE << "]" << std::endl; } ``` 在此例子中,`matrix.resize(MAX_SIZE)` 动态分配了外层向量的空间,而嵌套循环内的 `row.resize(MAX_SIZE, 0)` 则负责处理每一行的数据填充工作[^3]。 --- ### 总结 `resize()` 是一种灵活便捷的方式来控制 `std::vector` 的长度变化行为。无论是扩充还是缩小规模,它都能很好地满足实际编程需求。然而,在具体应用过程中需注意边界条件以及性能开销等问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值