即使下标在范围内,2d矢量下标超出范围

时间:2014-02-19 02:16:35

标签: c++ 2d-vector

所以我试着编写一个简单的代码,它将从用户那里获取2个字符串。然后使用length()获取字符串的长度,并根据长度创建一个int的矩阵(2d向量)。然后,我需要将最后一行和最后一列的值设置为幂为2的值。 如果输入的字符串是“快乐的”& “悲伤”的结果矩阵应该是:

0 0 0 0 0 6
0 0 0 0 0 4
0 0 0 0 0 2 
10 8 6 4 2 0 

我正在生成这样的矩阵:

    vector<vector<int>> opt;
    unsigned int x, y;
    x = (sequenceOne.length()) + 1;
    y = (sequenceTwo.length()) + 1;

    unsigned int p,q;

    opt.resize(y, vector<int>(x, 0)); // resizes the matrix

当我尝试使用以下内容更改矩阵中的值时

    opt[2][2] = 5;      

它工作正常,但是当我去最后一行访问最后一行时:

    opt[x][y]

它告诉我“表达式:向量下标超出范围” 我认为它与获取字符串的长度作为值有关,但我不能为我的生活弄清楚为什么会导致问题。 我已经尝试使下标包含不同的变量,不同的顺序以及opt [x-1] [y-1]之类的内容,但错误仍然存​​在。

我不确定这是否重要,但我使用的是MS VS2012。

2 个答案:

答案 0 :(得分:1)

数组为0索引。 xy是数组的大小。您不能将大小值用作索引值。

例如: enter image description here

a的大小为5. "a"位于索引0处,"e"位于索引4处。"e"是列表中的第5个元素。当您尝试使用5的大小作为索引时,索引5处没有元素,如您所见。将访问最后一个元素a[size - 1]。虽然记住,大小为0会导致索引为-1,这是一个无效的索引。

答案 1 :(得分:0)

C ++数组的工作原理如下:

vector<int> v = {2, 4, 6, 8}
//index:         0  1  2  3

因此,数组中的最后一个元素实际上是opt[x - 1][y - 1]