2012-11-07 38 views
5

我正在尋找STL實現(SGI,STLport,libC++)的一些源代碼,並且看到了一些似乎對所有或大多數實現共同的設計模式,但我找不到任何理由。我認爲必須有一個良好的振振有辭,想知道它是什麼:STL背後的設計原理

  1. 很多類,其中包括在其他vectorlist_iterator,並執行了2班,例如list_iterator_base部分功能,然後list_iterator繼承list_iterator_base與接口的其餘部分。有什麼意義?看起來它可以在一個班級中輕鬆完成。

  2. 迭代器似乎沒有使用iterator類。使用它會有一些性能損失嗎?

這些是我在短時間內發現的兩個問題。如果有人知道解釋STL實現的實現原理的好資源,我很樂意聽到它。

+0

「珍寶蝦」。 –

+0

請注意,技術上STL和標準庫(stdlib)是不同的。後者大部分來自前者,而後者被添加到官方語言標準中。幾乎沒有人再使用「真正的」STL,而是使用標準庫的實現(例如,libC++)。很多人都把stdlib稱爲STL,這通常很好,但對於你的問題,區別會改變它的含義。 – GManNickG

+0

@DaveNewton我不明白你的意見。 – baruch

回答

7

的答案相當簡單:

  1. STL是所有關於泛型編程。關鍵的想法是不要有重複的代碼。目前的目標是沒有重複的源代碼,但事實證明,不重複二進制代碼也是有意義的。因此,STL組件將通常使用的零件分解並使用它們是很常見的。列表類的鏈接或矢量的類型獨立屬性只是兩個示例。對於矢量甚至有多個圖層:一些部分完全獨立於類型(例如,大小),其他部分只需要類型本身(例如,所有訪問器,迭代器等),並且一些部分需要知道處理資源分配(例如,插入和銷燬需要知道正在使用的分配器)。
  2. 事實證明,std::iterator<...>並沒有真正的工作:根據模板參數定義在基類中的類型不能直接在派生自這樣一個基類的類模板中訪問。也就是說,這些類型需要使用基類來限定,並且需要使用typename將其標記爲類型。更糟糕的是,用戶理論上可以分配派生類的對象,並通過指向std::iterator<...>(是的,這將是一件愚蠢的事)來釋放它們。也就是說,沒有任何好處,但有潛在的缺點,即最好避免。

這就是說,我不知道任何好的資源覆蓋實現通用庫的技術。在STL實現中應用的大多數細節都是由多人獨立發明的,但關於泛型編程的文獻仍然相對較少。我認爲任何描述STL的論文都沒有討論實現技術:他們通常專注於設計細節。由於只有極少數人能夠理解STL的內容,因此作者傾向於專注於描述STL的內容而不是如何實施STL並不令人驚訝。

+0

關於第2點:如果它不工作,爲什麼要保持它?爲什麼它被添加到標準庫? – baruch