vector
s operator[]
は、境界チェックなしで指定された要素への参照を返します。
つまり、ベクトルが魔法のようにサイズ変更されたり、要素が存在することを保証するために他の操作を実行したりすることはありません。要素が存在しない場合、結果は未定義の動作です。つまり、何かが起こる可能性があります。実際には、多くの場合、プログラムは無効なメモリ位置にアクセスし、クラッシュを引き起こします。
上記は単なるvector<int>
でも当てはまります。 vector<vector<int> >
(vector<vector<int> >
の各要素はvector<int>
です)を使用して問題を複合化しました。
あなたの関数は、実際には未定義のビヘイビアを呼び出す回数が少し息を吹いています。ステートメントnewMatrix[i][j] = m[i][j]
でクラッシュすることがありますが、実際には未定義の動作の可能性があります。
(コードでチェックされていない)の値が0の場合、外部ループではm[i]
は存在しません。 m.size()
が0の場合、m[i]
(m.operator[](i)
)の評価は未定義の動作になります。
は基本的に、あなたはm[i]
を評価する前にi
が有効である任意のインデックスを確認し、[ALSO j
がm[i][j]
を評価する前に、m[i]
の有効な指標であることを確認する必要があります。そしてnewMatrix
についても同様にします。あなたのコードはこれをまったく実行しません。あなたの機能のより正確なレンダリングが、事はある、あなたのコードが実際にベクトルがすでに提供する機能を再現している今
vector< vector<int> > resizeVector(vector< vector<int> > m)
{
vector< vector<int> > newMatrix;
int i,j;
newMatrix.resize(m.size()); // necessary to ensure we can access newMatrix[i] in the loop below
for (i = 0; i < m.size(); i++) // ensure i is a valid index of m
{
// newMatrix[i].size() is still zero, so we need to resize for use in the inner loop
newMatrix[i].resize(m[i].size());
for(j = 0; j < m[i].size(); j++) // ensure j is a valid index of m[i]
{
newMatrix[i][j] = m[i][j];
}
}
return (newMatrix);
}
である(意図と仮定してm
のコピーを作成することです)。そこで、我々は
vector< vector<int> > resizeVector(vector< vector<int> > m)
{
vector< vector<int> > newMatrix(m);
return newMatrix;
}
で非常に単純に関数の本体を交換することができ、さらには
vector< vector<int> > resizeVector(vector< vector<int> > m)
{
return m;
}
とこれはあなたの関数を意味します(私はそれを変更したとして)misnamedされる - それはサイズ変更されません。何でも実際には、呼び出し側がこの
x = resizeVector(y);
が、それは単純にも、より効率的である
x = y;
(ノー関数として、全くあなたの機能のない同じ効果を得ることができない場合は、以来、むしろ無意味ですコール、値渡しなどのコピーの作成はありません)。