STL中的最有用的经验总结(二)

一、STL容器不能保证线程安全

解释:在执行改写容器中内容的语句的时候,STL不能保证结果的唯一性。当然,多线程的并发读操作是线程安全的。

常见的写操作包括:插入(push),弹出(pop),删除(erase、clear),赋值(*p=3;)等,因此在多个线程并发改写容器内容的时候,要加锁保证线程的同步。

二、无论何时,你发现你自己准备动态分配一个数组(也就是,企图写“new T[...]”),你应该首先考虑使用一个vector或一个string。(一般来说,当T是一个字符类型的时候使用string,否则使用vector,但我们在本条款的后面将遇到的情况中,vector<char>可能是一个合理的设计选择。)

三、使用“交换技巧”来修整过剩的内存容量(百度二面的时候考过我这个问题)

vector的clear或erase函数不会真正释放掉内存,因此当一个vector的capacity很大但是你暂时用不了这么大的内存的时候,应该对capacity做适当修剪,采用swap函数吧。

原理:用一个临时对象和当前vector进行swap(交换),临时对象出作用域后自然就释放掉了内存。

vector<int> v(100);//capacity==100
  .........                   //省略各种操作
//准备修剪内存(clear和erase是不行的)
{
   vector<int>().swap(v)//和capacity==0的临时变量交换
}//释放内存
cout<<v.capacity()<<end;//等于0

当然,也可以仅仅把多余的没有使用的内存释放掉,如下:

vector<int> v(100);//capacity==100 
v.push_back(1);
cout<<v.capacity()<<end;//等于150
 .........                   //省略各种操作
//准备修剪内存(clear和erase是不行的)
{   
     vector<int>(v).swap(v)//(v)调用的是v的拷贝构造函数,仅仅拷贝实际存在的值
}//释放内存
cout<<v.capacity()<<end;//等于101

string中的使用也是完全一致的。
vector<Contestant> v;
string s;
... // 使用v和s
vector<Contestant>().swap(v); // 清除v而且最小化它的容量
string().swap(s); // 清除s而且最小化它的容量
四、避免使用vector<bool>

理由:第一,它不是一个STL容器。第二,它并不容纳bool。

至于原因,Effective_STL那本书上条款18讲的很好,但是我没有看明白,所以不敢乱说。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值