我一直在阅读关于C++的书中的STL容器,特别是关于STL及其容器的部分.现在我明白了每一个都有自己的特定属性,而且我已经接近记住了所有这些...但我还没有掌握的是在哪种情况下使用它们.
解释是什么?示例代码是更受欢迎的.
这个备忘单提供了不同容器的非常好的总结.
请参阅底部的流程图,作为在不同使用场景中使用的指南:
由David Moore创建并获得CC BY-SA 3.0许可
这是一个灵感来自David Moore的版本(见上文)的流程图,我使用新标准(C++ 11)创建了最新版本(主要是).这只是我个人对它的看法,这不是无可争议的,但我认为这对这个讨论很有价值:
简单回答:std::vector
除非你有其他原因,否则请用于所有事情.
当你发现一个你正在思考的情况时,"哎呀,std::vector
因为X而在这里效果不好",那就去X吧.
请看Scott Meyers的Effective STL.它擅长解释如何使用STL.
如果你想存储一个确定/未确定数量的对象而你永远不会删除任何对象,那么你想要的是一个向量.它是C数组的默认替换,它可以像一个一样工作,但不会溢出.您也可以使用reserve()预先设置其大小.
如果你想存储不确定数量的对象,但是你要添加它们并删除它们,那么你可能想要一个列表......因为你可以删除一个元素而不移动任何后续元素 - 不像vector.但是,它需要比向量更多的内存,并且您无法顺序访问元素.
如果你想获取一堆元素并只找到这些元素的唯一值,那么将它们全部读入一个集合就可以了,它也会为你排序.
如果你有很多键值对,并且你想按键对它们进行排序,那么地图很有用......但它只能为每个键保存一个值.如果每个键需要多个值,则可以在地图中使用矢量/列表作为值,或使用多图.
它不在STL中,但它在STL的TR1更新中:如果你有很多键值对,你将按键查找,而你不关心他们的顺序,你可能会想要使用哈希 - 这是tr1 :: unordered_map.我在Visual C++ 7.1中使用它,它被称为stdext :: hash_map.它有一个O(1)的查找,而不是查找映射的O(log n).
我重新设计了流程图以获得3个属性:
我认为STL容器分为两大类.基本容器和利用基本容器来实现策略.
首先,流程图应该将决策过程分为我们应该决定的主要情况,然后详细说明每个案例.
一些扩展容器可以选择不同的基本容器作为其内部容器.流程图应考虑可以使用每个基本容器的情况.
流程图:
此链接提供了更多信息.
只简单地提到迄今很重要的一点是,如果你需要连续的存储器(如C数组给出),则只能使用vector
,array
或string
。
array
如果在编译时已知大小,则使用此方法。
使用string
,如果你只需要使用字符类型的工作,需要一个字符串,而不是只是一个通用的容器。
使用vector
在所有其他情况下(vector
应该是在大多数情况下,默认选择容器的反正)。
使用这三种方法,您都可以使用data()
成员函数获取指向容器第一个元素的指针。