我一直在读我c++书中关于STL容器的内容,特别是关于STL及其容器的部分。现在我明白了每一个都有自己特定的属性,我也快记住它们了……但我还不明白的是,它们分别在哪个场景中使用。

怎么解释呢?最好是示例代码。


当前回答

我重新设计了流程图,有3个属性:

我认为STL容器主要分为两个类。基本容器和利用基本容器实现策略的容器。 首先,流程图应该将决策过程划分为我们应该决定的主要情况,然后详细说明每种情况。 一些扩展容器可以选择不同的基本容器作为它们的内部容器。流程图应考虑每个基本容器可以使用的情况。

流程图:

更多信息在此链接提供。

其他回答

简单的回答是:对所有东西都使用std::vector,除非你有真正的理由不这么做。

当你遇到这样的情况,你会想,“哎呀,std::vector因为X的原因在这里不能很好地工作”,那就以X为基础。

我重新设计了流程图,有3个属性:

我认为STL容器主要分为两个类。基本容器和利用基本容器实现策略的容器。 首先,流程图应该将决策过程划分为我们应该决定的主要情况,然后详细说明每种情况。 一些扩展容器可以选择不同的基本容器作为它们的内部容器。流程图应考虑每个基本容器可以使用的情况。

流程图:

更多信息在此链接提供。

我学到的一个教训是:试着把它包装在一个类中,因为在一个美好的日子里改变容器类型会产生很大的惊喜。

class CollectionOfFoo {
    Collection<Foo*> foos;
    .. delegate methods specifically 
}

它的前期成本不高,并且在调试时节省了时间,当有人在这个结构上执行x操作时就会中断。

接下来是为工作选择完美的数据结构:

每个数据结构都提供了一些操作,这些操作可以随时间复杂度变化:

O(1) O(lgn) O(N)等等。

本质上,您必须进行最佳猜测,即哪些操作将被执行最多,并使用具有O(1)操作的数据结构。

很简单,不是吗?

我在另一个问题中回答了这个问题,这个问题被标记为dup。但是我觉得参考一些关于决定选择标准容器的好文章是很好的。

正如@David Thornley回答的那样,如果没有其他特殊需求,std::vector是一种选择。这是c++的创始人Bjarne Stroustrup在2014年的一篇博客中给出的建议。

这是文章的链接 https://isocpp.org/blog/2014/06/stroustrup-lists

引用这句话,

是的,我的建议是默认使用std::vector。

在评论中,用户@NathanOliver也提供了另一个很好的博客,其中有更具体的测量方法。https://baptiste-wicht.com/posts/2012/12/cpp-benchmark-vector-list-deque.html。

我扩展了Mikael Persson奇妙的流程图。我添加了一些容器类别、数组容器和一些注释。如果你想要自己的副本,这里是谷歌绘图。谢谢你,Mikael做了基础工作! c++容器选择器