C ++ stdlib容器类层次结构

时间:2013-02-23 13:16:01

标签: c++

我一直在想,是否有任何理由让C ++中的设计决定没有任何std库容器的纯抽象类?

我很欣赏hash_map稍后来自stdext命名空间,但共享一个非常相似的接口。如果我后来决定要为特定的软件实现我自己的地图,我宁愿有某种界面可以使用。

实施例

std::base_map *foo = new std::map<std::string, std::string>;
delete foo;
foo = new stdext::hash_map<std::string, std::string>;

显然上面的例子是不可能的,据我所知,然而这与list和其他std lib容器类似。

我理解这不是C#或Java,但C ++中显然没有限制来阻止这种设计,所以为什么它设计得这样,以便类似容器之间没有耦合。

1 个答案:

答案 0 :(得分:2)

因为虚函数增加了开销。

因为容器都具有相同的接口,所以有常见的功能,但是关于迭代器失效和内存分配(以及异常行为)的重要区别,如果你需要了解它们使用抽象基础你不会知道混凝土容器的行为方式。

如果你想编写与传递容器类型无关的代码,那么在C ++中你编写一个模板而不是依赖于抽象接口,即使用静态多态而不是动态多态性。这避免了动态分派的开销,并且还允许基于具体类型的特化,因为具体类型在编译时是已知的。

最后,它没有任何优势恕我直言。它的方式更好。如你所说,谢天谢地,这不是C#或Java。

(PS stdext命名空间不是C ++的一部分,它似乎是Microsoft的非标准类型的命名空间,更好的例子是使用std::tr1::unordered_mapstd::unordered_map而不是stdext::hash_map