#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函数,结果如下: