关于C++vector容器内使用reserve函数预留能否被覆盖的问题

#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc_c.h>

using namespace std;
using namespace cv;

int main()
{
	vector<int> a;
	a.reserve(4);//预留四个位置出来,此处预留的内存空间的大小,而非尺寸
	cout <<"a.size():"<< a.size() << endl; //输出现有容器大小

	for (int i = 0; i < a.size(); i++)//第一个for循环
	{
		a.push_back(i);
		cout <<"i"<< a.size() << endl;
	}

	cout <<"------------------"<< endl;

	for (int j = 0; j < 4; j++)
	{
		a.push_back(j);
		cout << "j" << a.size() << endl;
	}

	cv::waitKey(0);
	return 0;
}

运行结果如下
运行结果如图
在使用reserve函数预留大小之后,vector并没有立马开始开辟空间。在第一个for循环中,由于a.size()为0,所以i没有推入。
在两个循环中,需要注意的有:
1.在插入j所代表的元素时,终止条件是j<4,而i是i<a.size()
2.j是在i后面插入的

现在查看内存空间开辟的情况
此处引用mijichui2153博主的文章如下:

#include<iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main(){
	vector<int> vec;
	int cap=vec.capacity();
	cout<<"capacity="<<cap<<endl;
	for(int i=0;i<10000;++i){
		vec.push_back(i);
		if(cap!=vec.capacity()){
			cout<<"capacity="<<cap<<endl;
			cap=vec.capacity();
		}
	}
	return 0;
}

在centos7下面执行结果如下。显然此处就是成倍扩展内存空间的,而且复制10000个数据足足重新分配了14次。
成倍扩展内存空间如下
2.在有四个预留空间时,后面插入的元素并没有覆盖前面存在的元素,内存空间可能是单个增加。
在第一个循环时,预留空间的确是四个。第二个循环的时候,内存空间并不是单个增加,而且后面插入的元素并没有覆盖前面的元素。


#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc_c.h>

using namespace std;
using namespace cv;

int main()
{
	vector<int> a;
	a.reserve(4);
	cout <<"a.size():"<< a.size() << endl;
	cout << "a.capacity():" << a.capacity() << endl;

	for (int i = 0; i < 4; i++)
	{
		a.push_back(i);
		cout <<"i size"<< a.size() << endl;
		cout << "i capacity" << a.capacity() << endl;
	}
	//a.clear();
	cout <<"------------------"<< endl;

	for (int j = 0; j < 4; j++)
	{
		a.push_back(j);
		cout << "j size" << a.size() << endl;
		cout << "j capacity" << a.capacity() << endl;
	}

	cv::waitKey(0);
	return 0;
}

运行结果如下
运行结果如下

此时,如果为了节省空间,在具体预先知道将会用到的内存空间下,指定其大小该如何做呢?
使用clear函数,结果如下:
使用clear函数的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值