国产化驱动经济自主性与科技创新的未来之路
716
2022-11-17
默认时使用vector,否则,选择其他合适的容器
对于一般的程序设计,尤其是容器的选择,有以下三个基本议题及相关问题。
编程时正确、简单和清晰是第一位的。尽量选择能使我们编写出最清晰的代码的容器。例如:如果需要在某个特定位置插入,就应该使用序列容器(如 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 的算法复杂性上的优势在数据量更大时才能发挥作用。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~