OPの報告されたコンパイラエラーはコードと一致しないように見えるので、問題はおそらく他の場所にあります。
しかし、ここでは、あらゆる種類の悪いことに対処しなければならない可能性があります。私は簡単に
vector<vector<int>> AsumB(int kolumny,
vector<vector<int>> matrix1,
vector<vector<int>> matrix2)
matrix1
とmatrix2
値で渡されを説明するために、コードを再フォーマットの自由を少し取りました。論理的には何も間違っているわけではありませんが、これは、コンパイラが非常にシャープでなければ、多くの不要なコピーが発生する可能性があることを意味します。
{
vector<vector<int>> matrix(kolumny);
外側vector
とvector
vector
のSを宣言はkolumny
に大き。内側にはvector
が割り当てられていないので、2D操作は破棄されます。
matrix = vector<vector<int>>(matrix1.size());
はmatrix1
の外側のベクトルと一致するような大き外側vector
と一時vector
vector
のSにします。この一時的なベクトルは、次に作成されたmatrix
に割り当てられ、現在の内容を置き換えて破棄されます。 matrix
には依然として内部ベクトルが割り当てられていないため、2D操作はまだ破棄されています。
for (int i = 0; i < kolumny; ++i)
for (int j = 0; i < (static_cast<signed int>(matrix1.size())); ++i)
i
とj
(彼らがしなければ、巨大なロジック問題)負に行くべきではありませんが、そう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
の内部ベクトルがcolumn
のvector
に初期化されることをコンパイラに伝えます。
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;
}
問題は何ですか? – sfjac
重大\tコード\t説明\tプロジェクト\tファイル\tライン エラー(アクティブ)\t抑制状態から\t \tなし適切なユーザ定義の変換 "Vector_val <はstd ::のstd :: _ Vector_iterator <はstd :: _ _ Simple_types >>" を " std :: _ Vector_iterator >>>> "存在する\t lab4 –
QWERTY1234567890
@CezaryCzekalskiそのエラーはどの行に表示されますか?質問に追加すると、おそらくもっと明確な質問になるでしょう。 –