为什么C ++容器不实现接口

时间:2011-11-27 12:19:04

标签: c++

  

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

为什么stlQt容器都没有实现接口。例如,Enumerablevectors的结果为lists

像这样:

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);
    //....
};

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

STL(标准模板库)的设计不需要通常的虚拟功能。在设计STL时,虚拟函数的成本足以在代码的关键部分中避免它们。通用编程只允许使用具体类型。这里解释http://en.wikipedia.org/wiki/Standard_Template_Library

答案 2 :(得分:0)

  

好吧,我从某处获得了vector,我需要将list的相同数据提供给某个地方。现在我需要在O(n)

中将vector转换为list

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

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

答案 3 :(得分:0)

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