2016-11-04 87 views
5

我試圖爲我的矩陣類創建單塊內存,因爲std::vector<std::vector<double>>沒有提供我想要的性能。所以我決定使用單個1d數組。所以我想爲這個使用double的shared_ptr。如何將偏移量添加到shared_ptr?

聲明變量我做:

matrix = std::make_shared<double []> (row*col);

我們獲得分配的東西到特定位置的元素:

std::shared_ptr<double> matrix;

要申報共享指針我沒有分配內存在矩陣中:

*(matrix + r*col + c) = 0.0;

這給了我錯誤說

'的錯誤:不對應的「運營商+」(操作數類型是「的std :: shared_ptr的」和「爲size_t」)

我想我們可以在指針使用+。爲什麼它不讓我爲指針添加標量值?

+9

爲什麼不使用'std :: vector matrix(row * col)'? – NathanOliver

+0

我不希望做自己的2D數學會比'vector >'更快。 –

+2

使用'matrix.get()+ ...'。或者做Nathan上面說的。 –

回答

6

std::shared_ptr不是一個指針,它是一個封裝指針的類。這就是爲什麼operator +不工作shared_ptr

如果你有一個普通的指針(double* matrix),那麼一切都會好起來。您可以通過使用get()

拿到常規指針出shared_ptr這改變你的代碼*(matrix.get() + r*col + c) = 0.0;

一個等效的表達式是matrix.get()[r*col + c] = 0.0;

存儲數據(如果你不希望它做共享另一種方式),它是使用std::vector

std::vector<double> matrix(row * col); 
matrix[r * col + c] = 0.0; 

使用矢量呈現優點,當你有一個調試版本,該operator []可以檢查表達式r * col + c是否返回無效索引(例如,如果r> = col)

+0

謝謝你的答案..由於某種原因,我忘了std :: shared_ptr不一定是一個指針,但實際上是圍繞指針的包裝:/ – solti

相關問題