2013-08-02 39 views
0

所有如何獲得多維向量的尺寸C++

我現在用多維STL的vector存儲用C我的數據++。我已經是一個3D矢量

vector<vector<vector<double>>> vec; 

我想從中檢索是:

&vec[][1][]; // I need a pointer that points to a 2D matrix located at column 1 in vec 

任何人有任何想法,這樣做呢?我會非常感謝任何幫助!

問候

+1

爲什麼你需要這個指針?...如果你想迭代這個矩陣,你可以用'vec [i] [1] [j]'來實現...... –

+0

關鍵問題是:你想做什麼?請給我們更多的背景。 – Manu343726

+0

嗨,@Manu343726我想做的是從函數返回一個大規模的矩陣。由於我的項目對速度性能有很高的要求。我必須返回指針而不是副本。 – ChangeMyName

回答

1

最好是考慮vec就像它的元素恰好是 載體-的向量-的雙,而不是作爲一個多維結構的載體。

你可能知道,但只是萬一你沒有,我會提到它, 這個數據類型並不一定代表一個長方體vec將只有那個「形狀」,如果確保所有的向量是 在每個級別相同的大小。該數據類型非常滿意矢量vec[j]vec[k]的大小不同,並且vec[j][n] 同樣也是與vec[j][m]不同的大小的矢量,因此您的結構「鋸齒」。

所以你想得到一個指向vector<vector<double>>的指針 索引1在vec。你可以做到這一點:

vector<vector<double>> * pmatrix = &vec[1]; 

但是這個指針將訪問該 vector<vector<double>>的不必要的尷尬手段。你肯定不能寫 喜歡的:

double d = pmatrix[j][k]; 

,並期望在座標(J,K)獲得double「矩陣由pmatrix解決 」。因爲pmatrix是一個指向矢量的矢量指針; 所以什麼pmatrix[j]指從pmatrix(未矢量的雙) 在索引j,其中索引進去的 sizeof(vector<vector<double>>)步驟載體的雙載體的最。該聲明將引用誰知道什麼 內存,並很可能導致您的程序崩潰。

相反,你必須寫等:

double d = (*pmatrix)[j][k]; 

其中(*pmatrix)給你的通過pmatrix, 或等價,但更容易混淆的解決載體的雙載體的-:

double d = pmatrix[0][j][k]; 

簡單得多 - 因此,自然的C++方法 - 是採取參考, rathe r比指針,在vec的索引1處的vector<vector<double>>。您 做到這一點只需:

vector<vector<double>> & matrix = vec[1]; 

現在matrix簡直是vector<vector<double>>索引1的另一個名字vec, ,你可以處理矩陣明智正如你所期望的(總假設 你已經確定它矩陣,而不是鋸齒陣列)。

需要考慮的另一件事是在manu343726的評論中提出的。你 希望接收該參考vec[1]能夠 用它來修改的vec[1]內容的代碼 - 這將包括改變其大小 或任何其內的vector<double> S的尺寸是多少?

如果你允許修改,那很好。如果你不這樣做,你想獲得 a const參考。你可以做到這一點:

vector<vector<double> > const & matrix = vec[1]; 

可能的話,你要接收的代碼才能夠修改包含它們的載體的double小號 但不是大小?在這種情況下,std::vector 是您的應用程序的錯誤容器類型。如果這是你的立場,我 可以更新這個答案,以提供替代容器。

0

考慮使用某些線性代數庫中的矩陣。有一些方向here