为什么不工作vector.clear()

时间:2013-01-04 13:35:08

标签: c++

需要帮助..请告诉我为什么“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;
}

3 个答案:

答案 0 :(得分:8)

A.clear()确实清除了数组,结果是A包含零元素。这与将每个元素设置为零不同。

您的代码具有未定义的行为,因为post 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';
}

答案 1 :(得分:5)

您正在调用未定义的行为。 A.clear()工作正常,但你正在读你不应该的记忆。尝试使用“&lt; A.size()”而不是“&lt; = N”

答案 2 :(得分:2)

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