默认时使用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 的算法复杂性上的优势在数据量更大时才能发挥作用。
编程时正确、简单和清晰是第一位的。尽量选择能使我们编写出最清晰的代码的容器。例如:如果需要在某个特定位置插入,就应该使用序列容器(如 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 的算法复杂性上的优势在数据量更大时才能发挥作用。
相关文章推荐
- 下面我使用vector容器为基础来构成一棵树
- Effective STL——选择一个合适的容器
- C++ Vector 序列容器 之 使用vector和迭代器
- vector容器类的使用
- 【C++ vector】容器类的使用(存放视频帧,生成视频示例)
- [置顶] 整理:warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
- 容器vector的使用总结 容器stack(栈)
- 当很频繁地对序列中部进行插入和删除操作时,应该选择使用的容器是()
- 【语言-C++】C++容器:list、vector、hash、map的区别及使用范围
- C++中vector容器的使用方式和函数调用
- 选择STL合适容器
- LNK4098: 默认库“MSVCRT”与其他库的使用冲突
- MSDN两天没有办法使用, 提示"当前子集中没有该选项,请选择其他子集",问题解决了
- error LNK2005 默认库与其他库的使用冲突
- C++ Primer : 第九章 : vector变长、string的其他操作以及容器适配器
- effective STL课堂笔记1-----如何选择合适的容器
- 默认库“library”与其他库的使用冲突;使用 /NODEFAULTLIB:library
- vector向量容器(常用的使用方法总结)
- C++中使用vector容器
- LINK : warning LNK4098: 默认库“LIBCMTD”与其他库的使用冲突