2012-11-12 40 views
4

標準是否要求some_container<T>::value_typeTSTL容器必需品

我在問,因爲我正在考慮實現符合STL的2d動態數組的不同方法。其中之一是有2Darray<T>::value_type2Darray_row<T>或類似的東西,其中數組將迭代作爲行集合(稍微簡化。我的實際實現允許迭代在3個方向)

+2

實際上,如果你想聲明你的模板是「容器」,那麼它可能是因爲你想將它傳遞給一些通用代碼,它將容器模板作爲模板模板參數,或者它只是一個縮寫定義。在前一種情況下,您可以查看泛型代碼*實際需要的名稱,而在後一種情況下,您可以完全記錄模板(特別是確保其迭代器真的是迭代器,因此它們可以使用標準算法),但如果您有疑問,就不要將它稱爲容器:-) –

+0

「來縮寫定義」 - 我的意思是縮寫文檔,對不起。 –

回答

5

容器的要求有點時髦因爲它們實際上不被任何通用算法使用。從這個意義上講,這並不重要。

也就是說,需求是在容器的接口上,而不是容器如何實際實例化。即使非模板類也可以符合各種要求,事實上也是如此。要求是value_type存在;它的定義完全取決於容器的實現。

+0

你能解釋一下你的評論嗎? – baruch

+0

不正確。 C++ 11中的23.2.1(和表96)指出,如果'X'是一個包含'T'類型對象的容器類,'X :: value_type'必須返回'T'。 – Angew

+0

它們不被任何算法使用,但我認爲它們可能被插入迭代器使用。 (至少,它們是我在標準中可以想到的容器類型實例化另一個模板的唯一地方。) –

2

表96在標準(C++ 11)§23.2.1需要含有T類型的對象返回TX::value_type一個容器類X

因此,如果您的some_container存儲T類型的對象,那麼value_type必須是T

+0

'std :: map'呢? – baruch

+1

§23.2.4(7)關聯容器滿足分配器感知容器的所有要求(23.2.1),除了map和multimap之外,表96中對value_type的要求適用於key_type和mapped_type。 – MWid

+0

DietmarKühl似乎在這裏有一個有效的觀點:http://stackoverflow.com/questions/13342936/stl-container-requierments#comment18208533_13343044 – baruch

0

要麼有一個嵌套容器(所以colArray<rowArray<T> >)或有一個包裝(2dArray<T>),但不要嘗試混合它們。嵌套的方法允許你一直使用STL(vector<vector<T> >),但可能會令人困惑,並且不允許你使用列迭代器等,你似乎想要。

This SO answer addresses using ublas,另一個建議使用Boost multi-arrays

通常,如果可以的話,請選擇STL或Boost選項。你不太可能自己寫一些東西。

+0

這是一個更好的學習STL的入口和出口的練習 – baruch

+0

由於row_type具有迭代器,並且能夠從'2Darray'中檢索列迭代器,所以我仍然會一直使用STL。但這不是問題的範圍,它只是爲什麼要這樣做的一個例子。 – baruch