使得n維收集的基礎知識會是這樣的。它假定容器不能被重新調整尺寸。
template< typename T >
class MultiDimContainer
{
std::vector<size_t> dims;
std::vector<T> data;
public:
MultiDimContainer(const std::vector<size_t> dims)
{
// work out the product of dims and set data to that size
}
T& at(const std::vector<size_t> & dim)
{
// calculate where it lives in memory and return that element
}
};
正如我已經在()採用一個參數,你可以使用operator []來實現這個。你可能會想要2重載,一個const和一個非const,並且at()會檢查邊界,而operator []不會。您可能需要一個幫助器(非模板)函數來計算數據向量中此元素的位置。
當然,構建矢量是一個多步驟的過程,所以你可以使用一些魔法類來構造一個。
您也可以讓operator []爲您的容器取一個size_t並返回一個ContainerReferencer對象。這不是一個真正的多維數組,而是其他地方的數據片。再次可以有const或非const版本。
使用此模型不可能獲取operator []的多個調用以過濾到T value_type或對其引用。
這將有可能使用一個硬尺寸的數組,這可能是一個模板參數。所以,如果你知道它是4維,你會稱它爲
MultiDimCollection <雙,4>
,它總是有4個維度。然後你可以讓運算符[]返回一個MultiDimCollectionReference < double,3>
這將會下降到2和1(一個向量),那麼這將專門返回一個標量。
順便說一句,你爲什麼需要這樣的容器?考慮boost :: array或boost :: multi_array怎麼樣? – upriser 2010-11-22 17:27:07