向量下标超出向量范围

时间:2019-08-02 04:48:53

标签: c++

也许已经晚了,但是我不明白为什么我的矢量下标超出了范围:

int m = 3;
int n = 2;
std::vector<std::vector<int>> path(m, std::vector<int>(n, 0));
for (int i = 0; i < path.size(); ++i)
    path[0][i] = 1;
for (int i = 0; i < path[0].size(); ++i)
    path[i][0] = 1;

有人可以告诉我这是怎么回事吗?

3 个答案:

答案 0 :(得分:3)

您没有正确使用索引。

for (int i = 0; i < path.size(); ++i)
    path[0][i] = 1;

需要成为

for (int i = 0; i < path.size(); ++i)
    path[i][0] = 1; // Swap i and 0

for (int i = 0; i < path[0].size(); ++i)
    path[i][0] = 1;

需要成为

for (int i = 0; i < path[0].size(); ++i)
    path[0][i] = 1; // Swap i and 0

答案 1 :(得分:2)

如果您像这样优化代码,问题将变得非常明显。

int m = 3;
int n = 2;
std::vector<std::vector<int>> path(m, std::vector<int>(n, 0));
for (auto& subVec : path) {
    subVec[0] = 1;
}
std::vector<int>& firstVec = path[0];
for (auto& item : firstVec) {
    item = 1;
}

答案 2 :(得分:1)

尝试此更改,我反转了您的循环条件。

int m = 3;
int n = 2;
std::vector<std::vector<int>> path(m, std::vector<int>(n, 0));
for (int i = 0; i < path[0].size(); ++i)
    path[0][i] = 1;
for (int i = 0; i < path.size(); ++i)
    path[i][0] = 1;