欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vector的resize()和reserve()

程序员文章站 2022-03-01 22:22:09
...

记一次面试中遇到的问题:vector的resize()和reserve()有啥区别

首先看这俩单词:

  • resize:v.改变大小
  • reserve:v.预定、保留

好啦,搞定!????


开个玩笑,不过确实很明了:

  • resize是改变该容器存储的数据数量(有效空间大小)
  • reserve是改变该容器预留的总空间大小

但是首先要知道vector的实现,才会觉得明了。

简单理解就是:

  • 内存2倍增长的动态数组;
  • 维护三个迭代器start、finish、end_of_storage;
  • 增加新元素时,如果超过当前容量,则会新申请足够的新空间,并将原空间中的元素移动到新申请的内存

vector的容量和其中存放数据量并不是一个东西
他们对应于capacity()和size()


reserve的作用:
只有一个用法:reserve(n)
更改vector的容量(capacity),使vector至少可以容纳n个元素。如果n大于vector当前的容量,reserve会对vector进行扩容。其他情况下都不会重新分配vector的存储空间(只能放大不能缩小)

resize的作用:
用法:resize(n) ; resize(n,t)
修改vector中元素的数量(即size)。如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化或值为t的元素。
当n超过现有的容量capacity,则会自动申请申请足够的新空间,即capacity也会改变。


resize:既分配了空间,也创建了对象。既修改capacity也修改size
reserve:只分配空间,不创建对象。只修改capacity


vector的内存只增不减,那怎么减呢?以减小vector< int > myvector 的内存为例
1.成员函数swap:vector< int>().swap(myvector);——执行完myvector内存直接减到0(等于和一个空vector交换)
2.成员函数shrink_to_fit():myvector.shrink_to_fit();——执行完只保留有效空间(size=capacity)

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> myvec(1000);
	cout << myvec.size() << " " << myvec.capacity() << endl;//1000 1000

	myvec.resize(1);
	cout << myvec.size() << " " << myvec.capacity() << endl;//1 1000

	vector<int>().swap(myvec);
	cout << myvec.size() << " " << myvec.capacity() << endl;//0 0

	myvec.resize(1);
	cout << myvec.size() << " " << myvec.capacity() << endl;//1 1

	myvec.reserve(1000);
	cout << myvec.size() << " " << myvec.capacity() << endl;//1 1000

	myvec.shrink_to_fit();
	cout << myvec.size() << " " << myvec.capacity() << endl;//1 1
}
相关标签: J-STL stl