0

助けが必要..「 A.clear() 」が最初の列もクリアしない理由を教えてください。................................................................... ……

#include <iostream>
#include <vector>
using namespace std;

int N, M;
vector< vector<int> > A;
int main()
{
    cin >> N >> M;
    A.resize(N + 2);
    for (int i = 0; i <= N; ++i)
    {
        A[i].resize(M + 2);
    }
    A.clear();
    for (int i = 0; i <= N; ++i)
    {
        for (int j = 0; j <= M; ++j)
        {
            cout << A[i][j] << ' ';
        }
        cout << '\n';
    }
    return 0;
}
4

3 に答える 3

8

A.clear()A結果として、ゼロ要素が含まれるという意味で配列をクリアします。これは、すべての要素をゼロに設定することと同じではありません。

A.clear()ポストループが空になったベクトルの終わりを超えて要素にアクセスするため、コードの動作は未定義です。たまたま、メモリは引き続きアクセス可能であり、古いデータが含まれています。ただし、これが当てはまるとは限りません。

A正しいディメンションを使用して繰り返した場合、それは空であることがわかります。

for (int i = 0; i < A.size(); ++i)
{
    for (int j = 0; j < A[i].size(); ++j)
    {
        cout << A[i][j] << ' ';
    }
    cout << '\n';
}
于 2013-01-04T13:37:34.697 に答える
5

未定義の動作を呼び出しています。A.clear()は正常に動作していますが、本来あるべきではないメモリを読み取っています。「<=N」の代わりに「<A.size()」を試してください

于 2013-01-04T13:37:32.763 に答える
2

clear予想どおりにすべての要素を0に設定するのではなく、ベクトルのすべての要素を削除します。clearを呼び出した後、ベクトルのサイズは0です。したがって、読み込もうとするとA[i][j]、範囲外のインデックスにアクセスし、何かが発生する可能性があります(コードが原因でundefined behavior)。

于 2013-01-04T13:37:19.397 に答える