慎重选择容器的类型
标准序列容器:vector,string,deque,list
标准关联容器:set,multiset,map,multimap
非标准序列容器:slist(单向链表),rope(重型string)
非标准的关联容器:hash_set,hash_multiset,hash_map,hash_multimap
标准的非STL容器:数组,bitset,valarray,stack,queue和priority_queue
1、如果需要在容器任意位置插入新元素,则考虑序列容器,关联容器做不到
2、如果不关心容器中的元素有排序关系,则哈希容器是一个可行的选择方案,否则,避免哈希容器。
3、如果你选择随机访问的迭代器,则对容器的选择限定为vector、deque、string。如果选择双向迭代器,那么你必须避免slist以及哈希容器的一个常见实现。
4、当发生容器中元素插入、删除操作,避免移动容器中原来的元素是否很重要?如果是,就要避免连续内存的容器。
5、如果元素查找速度是关键因素?如果是,就要考虑哈希容器、排序的vector和标准关联容器。
6、如果容器内部使用了引用计数,如果介意的话,则避免使用string,因为许多string的实现都使用了引用计数。
7、对插入和删除操作,你需要事务语义吗?也就是说在插入失败和删除的情况下,你需要回滚的能力吗?如果需要,你就要使用基于节点的容器。如果对于多个元素的插入需要事务语义,则需要使用list。
8、如果需要使迭代器、指针和引用变为无效的的次数最少,就要使用基于节点的容器。
9、如果序列容器的迭代器是随机访问类型,而且只要没有删除操作发生,且插入操作只发生在容器的末尾,则指向数据的指针和引用就不会变为无效。
不要试图编写独立于容器类型的代码
确保容器中的对象拷贝正确而高效
容器遵循(copy in,copy out)的原则,但在c++11可以用emplace_back进行原地构造元素,而不需要先构造再复制的过程,其中省略了一次复制过程。
STL的实际目标是为了避免创建不必要的对象。
Widget w[maxNumWidgets];//创建了有maxNumWidgets个widget的数组
//每个对象都使用了默认构造函数来创建
std::vector<Widget> vw;
vw.reserve(maxNumWidgets);//创建了足够空间来容纳maxNumWidgets个对象,但并没有创建任何一个widget对象。
调用empty而不是检查size()为0
empty对所有标准容器都是常数时间操作,而一些list实现,对于size是耗费线性时间(其中涉及到list的链接问题,如果链接操作时常数时间,则size是线性时间,反之亦然)。
区间成员函数优先于与之对应的单元素成员函数
当你需要完全替换一个容器的内容是,你应该想到赋值。如果你想把一个容器拷贝到相同类型的另一个容器,那么operator = 是可选择的赋值函数。但当你想给容器一组全新的值时,你可以使用assign,而operator=则不能满足你的要求。
v2.assign(v1.begin()+v1.size()/2,v1.end());//100分写法
v2.clear();
copy(v1.begin()+v1.size()/2,v1.end(),back_inserter