C ++容器选择/选择

时间:2011-06-22 10:11:24

标签: c++ collections stl

StackOverflow和其他网站上有很多关于使用什么类型的C ++容器的讨论,其结论并非如此令人震惊“这取决于您的需求”。

目前我在我的界面上使用std :: list,但是我对列表没有直接要求,而不是矢量或deques;在那里存在我的问题。

我不能说我的要求是什么。今天它是一个清单,明天......谁知道?

我一直在想要创建一个包装类'Collection'的想法,它除了暴露STL容器接口之外什么也不做,只有在需要的时候才能改变内部结构而不会破坏我的接口。

这值得麻烦吗? 我应该把它搞砸并根据我目前的需求做出决定吗?

有什么意见吗?

干杯, 本

编辑:

线程安全很重要。

重新编译使用该接口的代码是不可接受的。

3 个答案:

答案 0 :(得分:3)

如果只是要在程序中选择使用不同的容器类型或创建某种运行时优化,你应该编写这样的类,但一般来说你应该知道容器的用途是什么,所以你知道如何使用它会导致您的需求。

不要仅仅因为不了解不同容器而创建一个类,因为这会浪费资源。在这种情况下,您应该了解一些主要容器类型的更多信息,例如列表,向量,队列,可能是映射,并在需要时使用它们。其中有这么多的唯一原因是不同的情况需要不同的容器来使编程更容易并且代码更有效。例如,如果你放置和移除很多,那么列表是好的,而如果你做更多的阅读,矢量会更快。当需要按照确切的顺序执行操作时队列很好(顺便说一下,priority_queue是相同的,除了你可以使用特定的顺序),地图适用于散列当前状态或类似的东西。

答案 1 :(得分:2)

您应该通常编写代码。但是,不是定义泛型Container,而是使用STL方法从容器(迭代器)中解耦算法。由于您想要动态链接,请阅读this article,您可能会在boost(any_range ...)中找到一些内容。

答案 2 :(得分:0)

如果您需要单个容器并希望快速更改其类型,请使用@icabod建议的typedef

如果你正在编写应该在编译时选择不同容器的算法,那么在容器上实现它们template代码,或者如果可能的话,在迭代器上实现它们。

只有在运行时需要选择容器类型时,才应实现多态ContainerCollection类+子类。