C++中capacity()用法总结
来源:互联网 发布:林允儿 爆料 知乎 编辑:程序博客网 时间:2024/05/16 15:20
在C++中,理解capacity和size之间的区别非常重要。容器的size是指它已经保存的元素的数目;而capacity则是在不分配新的内存空间的前提下它最多可以保存多少元素。
函数 功能capacity() 容器能存储数据的个数size() 容器目前存在的元素数reserve() 指定容器能存储数据的个数resize() 重新指定有效元素的个数,区别与reserve()指定容量的大小当创建空容器时, 容量(capacity)为 0;当用完时,增加原容量的 1/2。
适用如 vector这种 元素连续存储的容器, 如为list则不同。
capacity 一般大于size的原因是为了避免每次增加数据时都要重新分配内存,所以一般会生成一个较大的空间,以便随后的数据插入。
2、举例说明
example1
vector v; //此时没有初始化,所以size()和capacity()都是0;cout<<v.size()<<endl<<v.capacity()<<endl;v.push_back(1);cout<<v.size()<<endl<<v.capacity()<<endl;//此时容器内有一个元素了,那么size()和capacity()都是1v.push_back(1);cout<<v.size()<<endl<<v.capacity()<<endl;//此时容器内能够提供的空间capacity()不够用了,需要申请内容,申请多少呢,申请后的大小应该是以前的2倍,那就应该是2了,此时有两个元素,size()为2,capacity()也是2v.push_back(1);cout<<v.size()<<endl<<v.capacity()<<endl;//此时容器能够提供的空间是2,又增加元素,不够,需要申请空间,申请后的空间为原来2倍,就是4了,那么size()为3,capacity()为4v.push_back(1);cout<<v.size()<<endl<<v.capacity()<<endl;//容器还能够提供一个空间,不需要申请新空间,size()为4,capacity()为4v.push_back(1);cout<<v.size()<<endl<<v.capacity()<<endl;//空间不够,需要申请,size()为5,capacity为8example2
#include <iostream>#include <vector>using namespace std;int main(){ vector<int> ivec; cout<<"capacity:"<<ivec.capacity()<<" size:"<<ivec.size()<<endl; //添加10个元素 for(int i = 0; i < 10; ++i) { ivec.push_back(i); cout<<"capacity:"<<ivec.capacity()<<" size:"<<ivec.size()<<endl; } //将容量用完 while(ivec.size() != ivec.capacity()) ivec.push_back(0); //添加1个元素 cout<<"size = capacity. insert one element\n"; ivec.push_back(0); cout<<"capacity:"<<ivec.capacity()<<" size:"<<ivec.size()<<endl; ivec.reserve(100); cout<<"reserve capacity 100\n"; cout<<"capacity:"<<ivec.capacity()<<" size:"<<ivec.size()<<endl; //将容量用完 while(ivec.size() != ivec.capacity()) ivec.push_back(42);//添加1个元素 cout<<"size = capacity. insert one element\n"; ivec.push_back(0); cout<<"capacity:"<<ivec.capacity()<<" size:"<<ivec.size()<<endl; system("pause"); return 0;}
3、capacity()和max_size()比较
capacity : 容器的成员函数capacity()取得
max_size:容器的成员函数max_size()取得
STL容器的capacity属性,表示STL在发生realloc前能允许的最大元素数,也可以理解为预分配的内存空间。例如一个vector v的capacity为5,当插入第6个元素时,vector会realloc,vector内部数据会复制到另外一个内存区域。这样之前指向vector中的元素的指针、迭代器等等均会失效。
max_size属性和capacity不同,表示STL容器允许的最大元素数,通常,这个数是一个很大的常整数,可以理解为无穷大。这个数目与平台和实现相关,在我的机器上vector的max_size为1073741823,而string的max_size为4294967294。因为max_size很大~所以基本不会发生元素数超过max_size的情况,只需知道两者区别即可。
4、一些容器与capacity
(1)并不是所有的容器都会发生realloc。
List,Map/Multimap,Set/Multiset的元素在内存中散布,不预分配内存,所以不会产生realloc的情况,对于这些容器,其capacity是无意义的,所以这些容器没有capacity()成员函数,也没有capacity属性。
(2)deque双向队列情况比较特殊,deque将内存分块,每次分配固定大小的分块,一个分块填充满后开辟新的分块,也属于散布-连续混杂的情况,虽然deque会预分配内存空间,但也不会产生realloc(人家是alloc),所以也不具有capacity属性。
(3)实际具有capacity属性的容器只有vector和string,在不同实现下,capacity也不尽相同。
除了通过构造式设定capacity,也可以使用reserve(n)来设定容器对象的capacity,避免之后的realloc。不过这一过程是只增不减的,如果n小于当前capacity,则reserve(n)无效。
C++容器中 size(), capacity, reserve() ,resize() 函数讲解
C++中capacity()函数用法
在C++中VECTOR的size()和capacity()取值
- C++中capacity()用法总结
- StringBuffer中length()和capacity()的区别用法
- StringBuffer中length()和capacity()的区别用法
- 关于C++中Size和Capacity的问题
- vector中capacity,reserve
- c语言中static 用法总结
- c语言中static 用法总结
- c语言中static 用法总结
- c/c++中const用法总结
- c语言中static 用法总结
- c语言中static 用法总结
- c语言中static 用法总结
- c语言中static 用法总结
- c c++中 #define用法总结
- c语言中static 用法总结
- c语言中static用法总结
- C语言中static 用法总结
- c/c++中const用法总结
- 系统自带播放器播放视频
- 【杭电】[2602]Bone Collector
- 计算一个字节中有多少位被置为1
- angular自定义表单验证----用户名唯一
- 由I2C学通信时序
- C++中capacity()用法总结
- ORA-00130:invalidlisteneraddress
- nyoj 38 布线问题
- AFNetworking网络请求networkactivityindicator不显示
- LeetCode *** 213. House Robber II
- 解决VirtualBox“不能为虚拟机xxxx电脑 打开一个新任务”
- 开发中的BUG
- iOS学习笔记29-系统服务(二)通讯录
- Druid 配置