2016-10-30 6 views
-2
vector<vector<int>> AsumB(
    int kolumny, vector<vector<int>> matrix1, vector<vector<int>> matrix2) { 
    vector<vector<int>>matrix(kolumny); 
    matrix = vector<vector<int>>(matrix1.size()); 
    for (int i = 0; i < kolumny; ++i) 
     for (int j = 0; i <(static_cast<signed int>(matrix1.size())); ++i) 
      matrix[i][j] = matrix1[i][j] + matrix2[i][j]; 

    return matrix; 
} 

行列1dimensionalベクトルの説明この種の仕事になるので、私は理解し、私はこの問題 を解決していないものを私に教えてください。2次元のベクトルが加え

+3

問題は何ですか? – sfjac

+0

重大\tコード\t説明\tプロジェクト\tファイル\tライン エラー(アクティブ)\t抑制状態から\t \tなし適切なユーザ定義の変換 "Vector_val <はstd ::のstd :: _ Vector_iterator <はstd :: _ _ Simple_types >>" を " std :: _ Vector_iterator >>>> "存在する\t lab4 – QWERTY1234567890

+1

@CezaryCzekalskiそのエラーはどの行に表示されますか?質問に追加すると、おそらくもっと明確な質問になるでしょう。 –

答えて

0

vector<vector<int>> AsumB(vector<vector<int>> const & matrix1, 
          vector<vector<int>> const & matrix2) { 
    vector<vector<int>> matrix(matrix1); 
    for (std::size_t i = 0U; i < matrix.size(); ++i) 
     for (std::size_t j = 0U; j < matrix[j].size(); ++j) 
      matrix[i][j] += matrix2[i][j]; 

    return matrix; 
} 

については何?

+0

自分で少しのコードを保存し、値で 'matrix1'を渡します。コンパイラにコピーをさせてください。 – user4581301

0

OPの報告されたコンパイラエラーはコードと一致しないように見えるので、問題はおそらく他の場所にあります。

しかし、ここでは、あらゆる種類の悪いことに対処しなければならない可能性があります。私は簡単に

vector<vector<int>> AsumB(int kolumny, 
          vector<vector<int>> matrix1, 
          vector<vector<int>> matrix2) 

matrix1matrix2値で渡されを説明するために、コードを再フォーマットの自由を少し取りました。論理的には何も間違っているわけではありませんが、これは、コンパイラが非常にシャープでなければ、多くの不要なコピーが発生する可能性があることを意味します。

{ 
    vector<vector<int>> matrix(kolumny); 

外側vectorvectorvectorのSを宣言はkolumnyに大き。内側にはvectorが割り当てられていないので、2D操作は破棄されます。

matrix = vector<vector<int>>(matrix1.size()); 

matrix1の外側のベクトルと一致するような大き外側vectorと一時vectorvectorのSにします。この一時的なベクトルは、次に作成されたmatrixに割り当てられ、現在の内容を置き換えて破棄されます。 matrixには依然として内部ベクトルが割り当てられていないため、2D操作はまだ破棄されています。

for (int i = 0; i < kolumny; ++i) 
     for (int j = 0; i < (static_cast<signed int>(matrix1.size())); ++i) 

ij(彼らがしなければ、巨大なロジック問題)負に行くべきではありませんが、そうunsigned型を使用します。右の符号なしタイプを使用し、static_castは無意味です。 j

  matrix[i][j] = matrix1[i][j] + matrix2[i][j]; 

また

インナーforループ単位とテストi、ではないが、私はここに他のインデックスにjためmatrixた何よりも間違って何も表示されません。これにより、アクセスが境界外になるのでUndefined Behaviourになります。

それは論理的に健全であるように、このクリーンアップ
return matrix; 
} 

vector<vector<int>> AsumB(const vector<vector<int>> & matrix1, 
          const vector<vector<int>> & matrix2) 

私たちは、列の数を必要としません。このベクトルはすでに関与するすべてのサイズを知っています。しかし、注意:vector<vector<int>>は、内側のすべての異なるサイズを許容します。vectorこれをやってはいけません。

次に、この関数は定数参照でパラメータをとります。参照ではコピーはありません。constでは、コンパイラはベクトルが変更されないことを知っており、関数をinsodeし、エラーを防ぎ最適化を行うことができます。

{ 
    size_t row = matrix1.size(); 
size_t

任意の表現オブジェクトインデックスに十分に大きいことが保証符号なしデータ・タイプです。それは十分なbgであり、あなたは厄介なネガティブ数字について心配する必要はありません。後でキャスティングする必要もなくなります。

if (!(row > 0 && row == matrix2.size())) 
    { 
     return vector<vector<int>>(); 
    } 

は、ここでは、誰もがinviolved行の彼ONT数を同意し、そうでない場合は、空のvectorを返すことを確認してください。例外をスローすることもできます。例外はより良い解決策かもしれませんが、私はユースケースを知らないのです。

size_t column = matrix1[0].size(); 
    if (!(column > 0 && column == matrix2[0].size())) 
    { 
     return vector<vector<int>>(); 
    } 

ダウズは上記と同じですが、列の数が適切であることを確認します。

vector<vector<int>> matrix(row, vector<int>(column)); 

結果を格納するためにローカルな行単位の行列を作成しました。 2番目のパラメータに注意してください。 vector<int>(column)は、すべてrowの内部ベクトルがcolumnvectorに初期化されることをコンパイラに伝えます。

for (int i = 0; i < row; ++i) 
    { 
     for (int j = 0; j < column; ++j) 
     { 

ここでは、すべてのサイズがわかっているので、ループを単純化しました。

  matrix[i][j] = matrix1[i][j] + matrix2[i][j]; 
     } 
    } 

    return matrix; 

コンパイラには、復帰時にコピーマトリックスを除去するために、いくつかのトリックがあります。より多くのことを知りたい場合は、希望のWeb検索エンジンでリターンバリューの最適化を参照してください。すべて一緒に }

vector<vector<int>> AsumB(const vector<vector<int>> & matrix1, 
          const vector<vector<int>> & matrix2) 
{ 
    size_t row = matrix1.size(); 
    if (!(row > 0 && row == matrix2.size())) 
    { 
     return vector<vector<int>>(); 
    } 
    size_t column = matrix1[0].size(); 
    if (!(column > 0 && column == matrix2[0].size())) 
    { 
     return vector<vector<int>>(); 
    } 
    vector<vector<int>> matrix(row, vector<int>(column)); 

    for (int i = 0; i < row; ++i) 
    { 
     for (int j = 0; j < column; ++j) 
     { 
      matrix[i][j] = matrix1[i][j] + matrix2[i][j]; 
     } 
    } 

    return matrix; 
}