Effective STL--交换技巧来修改过剩容量

 通过“交换技巧”来修正过剩容量

         假设一个向量在使用的过程中被扩大了容量,但是在以后的过程中向量中的元素又被删除,虽说向量中的元素被删除但是向量的容量没有变小,也就是说原来申请的内存空间没有得到释放,加入在某一个时刻向量的容量为10000,最后向量中的元素个数可能是10,那么过剩的空间就是浪费,这个时候可以通过交换算法来修改向量的大小。

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

 

int main()

{

   vector<int> vc;

   vc.reserve(128);

   for(int i=0;i<10;i++)

       vc.push_back(i);

   cout<<vc.size()<<endl;

   cout<<vc.capacity()<<endl;

   vector<int> (vc).swap(vc);

   cout<<vc.size()<<endl;

   cout<<vc.capacity()<<endl;

   system("pause");

   return 0;

}

 

String s;

                   //在使用的过程中使s变大,然后又删除了所有,这个使用s的容量很大,但是size很小。

         String(s).swap(s);   //在s上进行“收缩到合适”。

 

         避免使用vector<bool>,vector<bool>不是一个STL容器,它并不容纳bool。因为vector<bool>是一个伪容器,并不保存真正的bool,而是打包bool以节省空间。哎一个典型的实现中,每个保存在vector中的bool占用一个单独的比特,而一个8比特的字节将容纳8个”bool”。在内部,vector<bool>使用了与位域等价的思想来表示它假装容纳的bool。

不过在STL中是有替代品的。而deque<bool>是一个STL容器,它保存真正的bool值。Deque内部内存不是连续的。所以不能传递deque<bool>中的数据给一个希望得到bool数组的 C API。第二个替代品是bitset,bitset不是一个STL容器,但它是C++标准库的一部分。与STL容器不同,它的大小在编译期固定,因此它不支持插入和删除元素。因为它不是一个STL容器,它也不支持iterator.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值