欢迎关注本公众号,专注面试题拆解
分享一套视频课程:《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 来预先分配足够的内存,避免多次重新分配内存。
用于减少不必要的内存重新分配和元素复制,从而提高性能。
示例
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。
示例
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电子书资料赠送
精彩文章合集
专题推荐