2013-02-23 82 views
3

我一直在想,是否有任何理由在C++設計決定沒有一個純抽象類的任何標準庫容器?C++ stdlib容器類層次結構

我明白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>; 

顯然上面的例子中是不可能的,據我所知,然而,這是清單和其他標準庫容器中的類似。我明白,這不是C#或Java,但顯然在C++中沒有限制阻止這種設計,所以爲什麼它是這樣設計的,以便在類似的容器之間沒有耦合。

回答

2

由於虛擬函數會增加開銷。

由於容器都具有相同的接口,也有關於迭代器失效和內存分配(等異常行爲),你需要了解常用功能也是重要的區別,如果你使用一個抽象你不知道混凝土容器如何表現的具體細節。

如果你想編寫代碼++編寫模板,而不是依賴於抽象接口不可知它傳遞然後用C容器的類型,即使用靜態多態性動態多態性。這避免了動態分派的開銷,並且還允許基於具體類型的專業化,因爲具體類型在編譯時已知。

最後,它不會有任何優勢恕我直言。它的方式會更好。正如你所說,這不是C#或Java,謝天謝地。

(PS的stdext命名空間是不是C++的一部分,它似乎是微軟的非標準型號的命名空間,一個更好的例子是使用std::tr1::unordered_mapstd::unordered_map代替stdext::hash_map

+0

這將清除它,我忽略了虛函數的開銷,我理解你對靜態多態性的看法。我明白所有容器並不都具有相同的界面,但我認爲共享功能具有自己的界面。你總是可以退回到子類型,但我也明白,除非絕對必要,否則應該避免倒下投擲。感謝您的回答! :-) – chrisw 2013-02-23 13:43:42

+2

C++的RTTI是非常有限的,你不能使用反射或任何東西來找到具體類型,所以除非你已經知道具體類型是什麼,否則你不能倒下,如果你已經知道你爲什麼使用多態? – 2013-02-23 14:01:10