您的位置:首页 > 其它

默认时使用vector,否则,选择其他合适的容器

2012-09-12 17:01 218 查看
  对于一般的程序设计,尤其是容器的选择,有以下三个基本议题及相关问题。

编程时正确、简单和清晰是第一位的。尽量选择能使我们编写出最清晰的代码的容器。例如:如果需要在某个特定位置插入,就应该使用序列容器(如 vector 、list);如果需要随机访问迭代器,就应该使用 vector、deque 或者 string;如果需要字典式的查找,比如c[0] = 42, 就应该使用关联容器(如 set、map),但是如果需要有序的关联容器,则不能使用基于散列的容器。

编程时只在必要时才考虑效率。如果已经证实查找速度是关键的考虑因素,那么应该根据实际性能数据,优先使用基于散列的容器,然后考虑使用有序的 vector,再后是 set 或 map ,一般是以此顺序考虑。但是,只有在容器足够大以至于可以忽略常数因子时,算法复杂性上的差异才会显现出来。对于保存想double这样的小对象的容器来说,在容器大小超过几千个元素之前,这种差异都不会出现。

尽可能编写事务性的、强错误安全的代码,而且不使用失效对象。如果插入和删除元素需要事务性的语义,或者需要尽量减少迭代器失效,则应该优先使用基于节点的容器(如 list、set 和 map)。

  其他方面应该遵循以下建议:默认情况下,应该使用vector,因为vector具有以下性质:

保证具有所有容器中最低的空间开销(每个对象只需 0 字节)。

保证具有所有容器中对所存放元素进行存取的速度最快。

保证具有与生俱来的引用局部性,也就是说容器中相邻对象保证在内存中也相邻,这是其他标准容器都无法保证的。

保证具有所有容器中最灵活的迭代器(随机访问迭代器)。

比其他所有容器的迭代器都快。

示例:

  将 list 用于小型列表。只是因为 ”对列表操作应该使用 list ” 而使用 list ,是一种常见的错误。将 vector 用于小型列表几乎总是优于使用list。即使在序列中间插入,对 vector 而言是线性时间操作,而对 list 而言是常数时间操作,但当容器相对较小时,vector 仍然总是优于 list ,因为它的常数因子更小,而 list 的算法复杂性上的优势在数据量更大时才能发挥作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: