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()工作正常,但是您正在读取不应该读取的内存。尝试使用 "< A.size()" 而不是 "<= N"

于 2013-01-04T13:37:32.763 回答
2

clear删除向量的所有元素,而不是像您期望的那样将它们全部设置为 0。调用 clear 后,向量的大小为 0。因此,当您尝试读取时,A[i][j]您正在访问超出范围的索引,并且任何事情都可能发生(您的代码导致undefined behavior)。

于 2013-01-04T13:37:19.397 回答