7

我正在尝试使用向量创建一个二维数组。我写了以下代码:

int main() {
    vector< vector<int> > v;

    int i, j;
    for(i=0; i<11; i++)
        for(j=0; j<11; j++)
            v[i].push_back(j);
    for(i=0; i<11; i++) {
        for(j=0; j<11; j++)
            cout<<v[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

现在我期待它打印数字 0 到 10,11 次(每次都换行)。但是代码给出了运行时错误(分段错误)。谁能告诉我哪里出错了?

谢谢。

4

5 回答 5

9

当您声明任何东西的向量时,它还没有任何元素。

因此:

v[i].push_back(j)

正在尝试将 j 插入到位置 i 处的向量 v 内的一个不存在的向量中。

在这种情况下,当您知道大小时,您应该使用构造函数中所需的元素数量来初始化向量:

vector<vector<int> > v(11);

初始化向量 v ,其中包含 11 个空向量。

于 2013-10-21T12:13:17.330 回答
1

当您尝试访问不可用的内存时会发生分段错误。通常,当使用向量时,这意味着您正在访问向量之外的元素(太高或太低)。

当您使用时,请vector始终使用size()您的功能,for loops因为它可以防止它溢出。您很可能通过 go 访问超出矢量大小的元素0...10(这将返回 11 个元素,并且无论如何它都未初始化)。

于 2013-10-21T12:12:54.503 回答
1

您没有初始化第一级向量。

for(i=0; i<11; i++)
    vector<int> subVector;
    v.push_back(subVector);
    for(j=0; j<11; j++)
        v[i].push_back(j);
于 2013-10-21T12:13:06.780 回答
0

v[i]尚不存在,您的向量向量为空。

将其更改vector< vector<int> > v(11);为具有包含 11 个向量的初始向量。

于 2013-10-21T12:10:08.047 回答
0

创建新向量时,默认情况下它没有元素。您必须使用 push_back() 插入元素。在您的情况下,您之前没有在向量中输入任何元素,并且您尝试在该向量的第 i 个位置插入仍然不存在的元素。

所以你需要明确定义向量的大小,即

vector<vector<int> > v(10);

现在,vector 知道有 10 个元素。

希望能帮助到你。快乐编码!

于 2019-05-19T20:31:57.083 回答