2016-11-04 110 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