首页 > 代码库 > 【足迹C++primer】27、vector对象是如何增长的
【足迹C++primer】27、vector对象是如何增长的
vector对象是如何增长的
当需要更多空间的时候,会重新分配比新空间需求更大的内存空间,作为备用
管理容器的成员函数
shrink_to_fit //只适用于vector,string,deque capacity reserve //只适用于vector,string c.shrink_to_fit() //请将capacity()减少为与size相同大小 c.capacity() //不重新分配内存空间的话,c可以保存多少元素 c.reserve(n) //分配至少能容纳n个元素的内存空间
capacity和size
size 是已经保存的元素的数目,capacity 是不分配新的内存空间的前提行下他可以保存多少个元素
#include<iostream> #include<vector> using namespace std; int main() { vector<int> ivec; //size应该为0;capacity的值依赖于具体实现 cout<<" ivec : size: "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; //向ivec添加24个元素 for(vector<int>::size_type ix=0 ; ix != 24 ; ++ix) ivec.push_back(ix); //size应该为24;capacity应该大于或等于24,具体值依赖于标准库实现 cout<<" ivec: size: "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; }
得到的结果是:
ivec: size: 0 capacity: 0
ivec: size: 24 capacity: 32
现在可以预分配一些额外空间
ivec.reserve(50); //将capacity至少设定为50,可能会更大 //size应该为24;capacity应该大于等于50,具体值依赖于标准库 cout<<" ivec :size: "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl;
输出结果是:
ivec: size: 24 capacity: 50
接下来可以用光这些预留的空间
//添加元素用光多余容量 while(ivec.size() != ivec.capacity()) ivec.push_back(0); //capacity应该未改变,size和capacity不相等 cout<<" ivec : size : "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl;
ivec: size: 50 capacity: 50
没有超出vector的容量那么就不会重新分配空间
ivec.push_back(42); //添加一个元素 //size的值现在应是51;capacity应该大于51,看以来的标准库 cout<<" ivec : size : "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl;
ivec: size: 51 capacity: 100
也可以用shrink_to_fit来要求vector将超出的多余内存退回给系统:
ivec.shrink_to_fit(); //要求归还内存 //size未变capacity应该看具体实现 cout<<" ivec : size : "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl;
结果是:
ivec: size: 51 capacity: 51
//小题实例
vector<int> ivec; //size应该为0;capacity的值依赖于具体实现 //添加256个单词 for(vector<int>::size_type ix=0 ; ix != 256 ; ++ix) { ivec.push_back(ix); } cout<<" ivec : size : "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; ivec.resize(500); //吧它capacity设定为至少500 cout<<" ivec : size : "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; ivec.shrink_to_fit(); //返回内存 for(int ix=0 ; ix != 12 ; ++ix) ivec.push_back(ix); cout<<" ivec : size : "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl;
工作全代码!!!
/** * 功能:vector对象时如何增长的 * 时间:2014年6月12日07:43:54 * 作者:cutter_point */ /* shrink_to_fit //只适用于vector,string,deque capacity reserve //只适用于vector,string c.shrink_to_fit() //请将capacity()减少为与size相同大小 c.capacity() //不重新分配内存空间的话,c可以保存多少元素 c.reserve(n) //分配至少能容纳n个元素的内存空间 */ #include<iostream> #include<vector> using namespace std; int main() { /* vector<int> ivec; //size应该为0;capacity的值依赖于具体实现 cout<<" ivec : size: "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; //向ivec添加24个元素 for(vector<int>::size_type ix=0 ; ix != 24 ; ++ix) ivec.push_back(ix); //size应该为24;capacity应该大于或等于24,具体值依赖于标准库实现 cout<<" ivec: size: "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; ivec.reserve(50); //将capacity至少设定为50,可能会更大 //size应该为24;capacity应该大于等于50,具体值依赖于标准库 cout<<" ivec :size: "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; //添加元素用光多余容量 while(ivec.size() != ivec.capacity()) ivec.push_back(0); //capacity应该未改变,size和capacity不相等 cout<<" ivec : size : "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; ivec.push_back(42); //添加一个元素 //size的值现在应是51;capacity应该大于51,看以来的标准库 cout<<" ivec : size : "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; ivec.shrink_to_fit(); //要求归还内存 //size未变capacity应该看具体实现 cout<<" ivec : size : "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; */ vector<int> ivec; //size应该为0;capacity的值依赖于具体实现 //添加256个单词 for(vector<int>::size_type ix=0 ; ix != 256 ; ++ix) { ivec.push_back(ix); } cout<<" ivec : size : "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; ivec.resize(500); //吧它capacity设定为至少500 cout<<" ivec : size : "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; ivec.shrink_to_fit(); //返回内存 for(int ix=0 ; ix != 12 ; ++ix) ivec.push_back(ix); cout<<" ivec : size : "<<ivec.size() <<" capacity: "<<ivec.capacity()<<endl; return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。