1

重複の可能性:
C++ オーバーロード: [][] 演算子のオーバーロード

クラス行列があり、そのデータが格納されており、返す演算子をvector<vector<double> > _data オーバーロードしたい[][]_data[row][cols]

私は周りを見回していましたが、それを使用してそれを行う方法がよくわかりませんvectorでしたvector

オペレーターをオーバーロードする必要があることはわかっています[]が、受け取るパラメーターは 1 つだけです。

おそらく内部ヘルパークラスを作成することを考えていましたが、これを理解することはできません。

何か案は?

ありがとう

4

3 に答える 3

4

少なくとも 2 つの選択肢があります。

  1. MatrixRowマトリックスの 1 行を格納するカスタム クラスを作成します。このクラスをオーバーロードoperator[]()して、行の要素を返すことができます。次に、マトリックス クラスがそれ自体をオーバーロードして、operator[]()を返しますMatrixRow

  2. operator[]()を返すには、マトリックス クラスでオーバーロードしますvector<double>。その後operator[]()、無料で 2 番目を取得します。

于 2013-01-08T23:25:38.817 に答える
1

どうですか:

double& operator()(size_t row, size_t col) {
    return _data[row][col];
}

// ...
m(2,4) = 10.3;

まったく同じではありませんが、構文的にはほぼ同じくらい便利で、基礎となる実装を抽象化します (したがって、ベクトル (1D) を 1 つだけ使用し、正しいインデックスを計算して 2D として表示する場合は、簡単に行う)。

ところで:ネストされたベクトルを使用すると、追加のメモリ(およびルックアップ)のオーバーヘッドが発生しますが、これは望ましくない場合があります。

于 2013-01-08T23:30:19.557 に答える
-1

私が見たところ、二次元ベクトルを作成しようとしています。したがって、これを行う方法は次のとおりです。

vector <vector<double>> _data;

vector <double> vec_d; // temporary helpful vector
double d=NULL;

for(int i=0;i<column_size;i++){
            _data.push_back(vec_d);

            for(int j=0;row_size<l;j++)
                _data[i].push_back(d);
    }

これを行った後、次の方法でデータにアクセスできます。

_data[1][0] = 1.5;
于 2013-01-08T23:26:25.717 に答える