C++11新特性(28)- 管理容器的容量
capacity和size
理解capacity和size的区别非常重要,容器的size是指已经保存在容器中的数据的个数,而容量是指在不再重新分配内存的前提下容器最大可以包含的数据的个数。举个例子:容量为2升的瓶子装了1升水。2升是capacity,1升是size。
管理容器的容量
在绝大多数情况下,程序员不必关注容器类内存管理的细节,把这些工作完全交给C++标准库。但是有时也会有例外:
要求操作的响应非常快,快到不能忽略从堆中申请内存的时间。
使用的空间非常大,大到不希望容器保持多余的内存空间。
这时就需要主动干预内存的取得和释放动作。C++标准库为此提供了相应的成员函数。
capacity:取得容器的容量
size:取得已经保存在容器中数据的个数。
reserve:分配至少可以容纳指定数量元素的内存空间。
shrink_to_fit:释放多余的内存空间,只保留可以容纳容器中数据的最小内存。
示例代码
vector<int> v;
//v中没有元素,capacity为0
cout << v.capacity() << endl;//0
v.reserve(1000);
//预先取得保存1000个元素的空间,capacity为1000
cout << v.capacity() << endl;//1000
for(int i = 0; i < 1000; i++){
v.push_back(i);
}
//空间已经取得,不再增加,capacity仍为1000
cout << v.capacity() << endl;//1000
for(int i = 0; i < 100000; i++){
v.push_back(i);
}
//继续添加元素,自动分配空间
cout << v.capacity() << endl;//128000
for(int i = 0; i < 100000; i++){
v.pop_back();
}
//元素虽然删除,空间维持不变。
cout << v.capacity() << endl;//128000
v.shrink_to_fit();
//释放多余空间。
cout << v.capacity() << endl;//1000
有两点需要特别说明:
在添加元素时,为了减少内存分配的次数,内存空间会分段取得,所以经常会略大于数据的个数
shrink_to_fit只是发出释放内存的请求,这个请求不一定总会被响应。
作者观点
要求不是很严格的时候,可以充分享受语言带来的便利和自由;条件很苛刻时,又可以实现充分的控制。这种收放自如的感觉恐怕只有C++程序员才能享受。
觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】