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
}
推荐阅读
-
小计C++中的引用和vector
-
ArrayList和LinkedList、Vector的优缺点?
-
C++vector resize与reserve对比
-
Java基础——对HashMap的put和resize方法进行理解
-
vector和arraylist的区别面试题(教你保证多线程顺序执行)
-
C++ vector::erase和无参构造函数的调用(代码教程)
-
详解C++ STL vector容量(capacity)和大小(size)的区别
-
vl_imreadjpeg和cv2的resize结果不同
-
备战蓝桥杯java(九):算法竞赛中的常用API :Vector和Stack
-
65、ArrayList和Vector的区别,HashMap和Hashtable的区别