【问题标题】:Why C++ containers does not implement interfaces [duplicate]为什么C ++容器不实现接口[重复]
【发布时间】:2012-01-07 07:14:08
【问题描述】:

可能重复:
Why is the C++ STL is so heavily based on templates? (and not on interfaces)

为什么stlQt容器都不实现接口。例如,Enumerable 对应于 vectorslists

像这样:

template <typename T>
class Enumerable
{
public:
    virtual const T at(int k) = 0;
    //....
    virtual ~Enumerable() {}
};

template <typename T>
class Vector: public Enumerable<T>
{
public:
    virtual const T at(int k);
    //....
};

因此,我使用的代码迫使我使用其中使用的具体类型的容器。

【问题讨论】:

  • 因为你想错了。使用模板编写通用代码;无需添加昂贵的虚拟层次结构来强加强制且不必要的“一切都必须是对象”的伪哲学。
  • 首先,不是 Enumerable 而是 RandomAccessContainer。其次,如果你只想使用抽象基,那么模板适配器就足够了吗?
  • 是的,你是对的。它有一些限制,模板不能编译到库中,这就是为什么我认为在特定代码中没有这样做,但这种情况并不常见,我认为不关心它
  • @Kerrek SB:我认为这应该是一个答案而不是评论。

标签: c++


【解决方案1】:

您认为使用标准容器无法实现的目标是什么?你的问题的答案是他们不需要。使用模板,您可以在零运行时成本的情况下获得接口带来的所有优势。

【讨论】:

  • 好吧,我从某处获得vector,我需要将相同数据的list 提供给某处。现在我需要在 Qt 的 O(n) 中将 vector 转换为 list。使用Enumerable,我将从某处获得Enumerable*,并将Enumerable&amp; 提供给某处而无需任何转换
  • @Lol4t0:您多久需要一个特定类型的具体容器,而不是迭代器?虽然这种多态性确实允许对容器类型进行抽象,但template'd 函数在迭代器上工作也是如此。
  • @Lol4t0 您正在考虑的解决方案可能不是最好的。向量和列表在概念上非常不同,因此很有可能您没有使用最佳方法。要么直接从您需要的容器类型开始,要么(如前所述)使用模板和迭代器。
  • 哦,你是对的,代码中的问题,我可以使用。不够通用。
【解决方案2】:

STL(标准模板库)的设计是不需要通常的虚函数。在设计 STL 时,虚函数的成本非常高,以至于试图在代码的关键部分避免它们。泛型编程通过仅使用具体类型来实现这一点。这里解释了http://en.wikipedia.org/wiki/Standard_Template_Library

【讨论】:

  • 即使现在虚拟函数的成本很低,因为该函数是虚拟的,您通常无法内联对那些会降低容器代码重要用例性能的函数的调用。跨度>
【解决方案3】:

好吧,我从某处获得vector,我需要将相同数据的list 提供给某处。现在我需要在 O(n) 中将 vector 转换为 list

没问题,list已经有了范围构造函数:

std::list<your_element_type_here> yay(your_vector.begin(), your_vector.end());

【讨论】:

  • 您不认为它会从begin 迭代到end 并将值一一复制到列表中吗?它是 O(n)
  • 我不明白,O(n) 正是你要求的,不是吗?
  • @Lol4t0:您的用户界面已损坏。除了需要std::list,它还应该接受一对(模板化的)迭代器。通常,C++ 对象拥有它们的内容,如果你不想创建拥有的副本,你应该允许通过迭代器直接访问另一个容器的数据。
  • @Kerrek SB,没错!我已经理解了这一点并在对主题的评论中进行了解释。还是谢谢你
【解决方案4】:

STL 通常避免使用虚函数和类似的抽象。 Enumerable 的概念由迭代器的概念建模,迭代器使用模板抽象。如果您想要容器的虚拟抽象,请查看 Thomas Becker 的 any_iterator 标头。

【讨论】:

    猜你喜欢
    • 2012-07-20
    • 2012-12-26
    • 1970-01-01
    • 2015-01-15
    • 2012-08-29
    • 1970-01-01
    • 2014-01-23
    • 2015-08-04
    • 2018-03-07
    相关资源
    最近更新 更多