2016-11-04 2 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 行列(行* col)'を使用しないのはなぜですか? – NathanOliver

+0

あなた自身の2D数学をすることは 'ベクトル>'より速いとは思いません。 –

+2

'matrix.get()+ ...'を使用します。あるいは、ネイサンが言ったことを実行してください。 –

答えて

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; 

は、優位性を提示します3210は、式r * col + cが無効なインデックスを返すかどうかを確認できます(たとえばr> = colの場合)

+0

答えていただきありがとうございます。何らかの理由で私はstd :: shared_ptrを必ず忘れてしまいましたが、実際にはポインタの周りにあるラッパーです:/ – solti

関連する問題