一、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讲的很好,但是我没有看明白,所以不敢乱说。