2011-04-17 60 views
3

我需要一個線性向量容器來表現得像一個多維向量容器。也就是說,一個向量如std::vector< std::vector< std::vector<int> > >被聲明爲std::vector<int>,但表現得好像是多維的。這要求我設置並獲取允許通過多個索引進行訪問的函數,而不僅僅是一個(即x, y, z而不僅僅是i)。線性多維容器

轉換不是問題(即將3D或2D索引轉換爲1D),我已經這樣做了。但是,我開始需要對幾個陣列使用相同的轉換。爲了使事情更加複雜,我需要一個線性陣列來表現如同2D,3D和4D。現在我想創建一個容器來處理內部的轉換。對於所有的意圖和目的,容器看起來像是多維的,但實際上它是一個線性陣列。

因此,首先,我不確定像boost這樣的庫是否有類似的實現。如果是這樣,請指向正確的方向。如果沒有,那麼我想創建一個供我使用,但有幾個問題。

我目前的做法是製作一個具有矢量容器的類。有一個GetVec()函數將返回std::vector的地址,以便我不必編寫std::vector已有的所有函數(獲取迭代器,大小等)。

我希望用戶能夠使用從1-D到N-D的容器。訪問時,應該允許用戶傳遞可以表示一維數組或N維數組的索引。我如何確保用戶傳遞正確數量的索引(在函數參數中)?另外,初始化時,用戶應該能夠指定尺寸(可變參數列表?)。

如果這是一個不好的想法一般,請讓我知道,但有充分的理由。如果沒有,任何關於如何去實現這個類的指針將非常感謝。

+1

只是出於好奇。你爲什麼需要那個? – zhengtonic 2011-04-17 17:58:13

+0

我正在對大約1000萬個可以放入多維數組的元素進行計算。我希望該陣列可以連續快速訪問並避免碎片。 – Samaursa 2011-04-17 18:46:34

回答

4

您有兩種選擇:std::valarray(及其拼接適配器)或boost::multi_array

第一個缺乏很多東西,並不經常使用(儘管它應該得到更多的愛)。第二個很重,但使用起來很乾淨。

另外,如果你打算對這些野獸做線性代數,你可以看看Eigen。

我還可以提到英特爾陣列構建模塊,它非常棒,可能就是你想要的。這取決於你對這些容器做什麼。

+0

這兩個數組都以連續的方式存儲元素嗎?也就是說,他們保證是連續的嗎? – Samaursa 2011-04-17 18:06:05

+0

@Samaursa:valarray是一個連續的記憶,你可以「拼接」你想要的方式。 Boost multiarray是一個連續的內存區域+額外整數,用於描述每個維度中的大小和拼接。 valarray的問題是它沒有迭代器。 – 2011-04-17 18:22:59

+0

@Samaursa:'boost :: multi_array'也適用於現有的連續數據。這可能是你想要的。 – 2011-04-17 18:32:53