面试题:vector里面reserve和resize方法的区别——网易互娱一面

旅行   2024-09-30 11:54   广东  

欢迎关注本公众号,专注面试题拆解

分享一套视频课程:《C++实现百万并发服务器》 面试需要项目的可以找我获取
,免费分享。 欢迎V:fb964919126







vector里面reserve和resize方法的区别





在 C++ 中,std::vector 是一个非常常用的数据结构,它提供了动态数组的功能。在vector中size()和capacity()属性分别对应着resize(size_type)和reserve(size_type)这两个方法。(比较基础的面试题,但是网易这种大厂都在考察,所以还是值得梳理下,这个要是答错一点,直接被pass)


size() 和 capacity() 的区别

size():

表示容器当前实际包含的元素数量。

size() 返回的是容器的大小,即容器中实际存在的元素数目。

capacity():

表示容器当前可以容纳的最大元素数量,即容器已经分配的内存空间。

capacity() 返回的是容器的容量,即容器当前可以存储的元素数目,而不一定全部使用。

01

reserve方法

reserve 方法用于预先分配内存,但不改变容器的实际大小(即元素的数量)。它的主要目的是提高性能,防止频繁的重新分配内存而导致的多次复制


语法

void reserve(size_t n);

功能

如果 n 大于当前的容量(capacity),则重新分配足够的内存,使容量至少为 n。

如果 n 小于或等于当前的容量,则不做任何操作。


用途

当你知道即将插入大量元素时,可以使用 reserve 来预先分配足够的内存,避免多次重新分配内存。

用于减少不必要的内存重新分配和元素复制,从而提高性能


示例

#include <iostream>#include <vector>
int main() { std::vector<int> vec; vec.reserve(10); // 预先分配内存,但不插入元素 for (int i = 0; i < 5; ++i) { vec.push_back(i); // 插入元素 } std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl; return 0;}

02

resize方法

resize 方法用于改变容器的实际大小(即元素的数量),并且可以指定默认值。


语法

void resize(size_t n);void resize(size_t n, T val);

功能

如果 n 大于当前的大小(size),则向容器末尾追加 val 直到大小达到 n。

如果 n 小于当前的大小(size),则删除末尾的元素直到大小达到 n。


用途

用于改变容器的实际大小,可以用于初始化或调整容器大小。

当你需要确保容器的大小为特定值时,可以使用 resize。


示例

#include <iostream>#include <vector>
int main() { std::vector<int> vec;
// 扩展大小至10,默认值为0 vec.resize(10); std::cout << "Size after resize(10): " << vec.size() << std::endl; std::cout << "Elements after resize(10): "; for (int elem : vec) { std::cout << elem << " "; } std::cout << std::endl;
// 缩小大小至5 vec.resize(5); std::cout << "Size after resize(5): " << vec.size() << std::endl; std::cout << "Elements after resize(5): "; for (int elem : vec) { std::cout << elem << " "; } std::cout << std::endl;
// 扩展大小至10,指定默认值为-1 vec.resize(10, -1); std::cout << "Size after resize(10, -1): " << vec.size() << std::endl; std::cout << "Elements after resize(10, -1): "; for (int elem : vec) { std::cout << elem << " "; } std::cout << std::endl;
return 0;}

详细解释

第一次 resize 调用:

vec.resize(10) 将向量的大小扩展至10。

新添加的元素默认初始化为0。

因此,输出的结果是 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]。

第二次 resize 调用:

vec.resize(5) 将向量的大小缩小至5。

删除了最后五个元素。

因此,输出的结果是 [0, 0, 0, 0, 0]。

第三次 resize 调用:

vec.resize(10, -1) 将向量的大小扩展至10,并且新添加的元素初始化为-1。

因此,输出的结果是 [0, 0, 0, 0, 0, -1, -1, -1, -1, -1]。

03

resize() 和 reserve() 的区别

resize(size_type n):

用于改变容器的实际大小。

如果 n 大于当前size(),则在容器末尾追加值为默认值的元素,直到size()达到 n。

如果 n 小于当前size(),则删除末尾的元素,直到size()达到 n。

resize() 方法会改变容器的实际大小,即 size()。


reserve(size_type n):

用于预先分配内存,但不会改变容器的实际大小。

如果 n 大于当前 capacity(),则分配足够的内存,使 capacity() 至少为 n。

如果 n 小于或等于当前 capacity(),则不做任何操作。

reserve() 方法不会改变容器的实际大小,即 size() 不变。


总结:

reserve方法:

用于预先分配内存,但不改变容器的实际大小。

目的是提高性能,防止频繁的重新分配内存。


resize方法:

用于改变容器的实际大小。

可以指定默认值来填充新添加的元素。

适用于需要确保容器大小为特定值的情况。

end



CppPlayer 



关注,回复【电子书】珍藏CPP电子书资料赠送

精彩文章合集

专题推荐

【专辑】计算机网络真题拆解
【专辑】大厂最新真题
【专辑】C/C++面试真题拆解

CppPlayer
一个专注面试题拆解的公众号
 最新文章