1.仔细选择容器

可选容器:

  • 标准STL序列容器:vector,list,sequence
  • 标准STL关联容器:set,multiset,map,mutimap
  • 非标准序列容器slist与rope
    其中,slist是单向链表,rope为重型string
  • 非标准关联容器hash_set,hash_mutiset,hash_map,hash_mutimap
  • vector作为string的替代
  • 标准非STL容器,诸如array,bitset,stack之类

在选择容器时需要顾虑的有很多,vector,list,deque之间的选择也就不说了,大家都懂。


根据内部元素物理地址的相互关联性,STL容器可以分为两类

1.连续内存容器
2.基于节点的容器

这两种容器其实也说得很多了,在这里要强调的是rope是连续的,而关联容器和散列容器是基于节点的。


选择容器时需要判断的一些依据

  • 是否需要在任意位置插入?
    如果是则不可选择关联容器
  • 容器内元素是否需要排序?
    是则不可选择散列容器
  • 是否必须是标准c++?
    否则不可使用slist,rope与散列容器
  • 迭代器是否有要求?
    随机访问迭代器需要vector,string,deque.slist不可以使用双向迭代器
  • 是否需要频繁插入删除?
    是则选择基于节点
  • 是否需要兼容c接口?
    是则选择vector
  • 是否对查找速度有要求?
    是则选择散列容器,sorted vector以及标准关联容器
  • 是否介意容器内部的引用计数?
    是则需要避免string与rope
  • 插入和删除如果失败是否需要回滚?
    是则需要选择基于节点的容器,如果是区间形式的操作,那只能使用list.
  • 是否需要尽可能少地让迭代器失效?
    是则选择基于节点的容器(他们的插入和删除操作从来不会让迭代器,指针,或者引用失效)
    deque的插入操作仅发生在末尾时,迭代器可能失效,但指针和引用不会失效,它是唯一会有这种情况的容器。