Vector下标超出c++的范围,无法找到错误的来源

Vector subscript out of range in C++, cannot find source of error

本文关键字:错误 下标 c++ 范围 Vector      更新时间:2023-10-16

我正在尝试解决USACO培训页面上的一个问题。问题在这里:

一个大小为N × N (1 <= N <= 10)的黑白方块图案转换成另一个方块图案。在给出以下可能的转换列表的情况下,编写一个程序来识别应用于原始模式的最小转换:

1:90度旋转:图案顺时针旋转90度。

2: 180度旋转:图案顺时针旋转180度。

3: 270度旋转:图案顺时针旋转270度。

4: Reflection:图案被水平反射(通过围绕图像中间的一条垂直线反射而变成自身的镜像)。

5:组合:图案水平反射,然后进行旋转(#1-#3)。

6: No Change:原来的图案没有改变。

7: Invalid Transformation:新模式不是通过上述任何方法获得的。

下面是我的代码:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
bool isequal(vector < vector <char>>q, vector < vector <char>>a, int n){    //checks if two vectors are equal, assumes that they are 2D
    int i, j;
    bool same;
    for (i = 0; i < n; i++){
        for (j = 0; j < n; j++){
            if (q[i][j] == a[i][j])
                same = true;
            else
                same = false;
        }
    }
    return same;
}
vector< vector <char>> r90(vector < vector <char>>q, int n){    //function to rotate by 90 degrees
    vector < vector <char>>rotatedq = q;
    int j, i;
    for (j = 0; j<n; j++){
        for (i = 0; i < n; j++){
            rotatedq[j][n - i - 1] = q[i][j];
        }
    }
    return rotatedq;
}
vector< vector <char>> reflect(vector < vector <char>>q, int n){    //function to reflect
    int i, j;
    vector < vector <char>>reflectedq = q;
    for (i = 0; i < n; i++){
        for (j = 0; j < n; j++){
            reflectedq[i][j] = q[i][n - j - 1];
        }
    }
    return reflectedq;
}
int main() {
    ifstream fin("transformin.txt");
    ofstream fout("transformout.txt");
    int n, i, x, y, min = 7;
    fin >> n;
    char c;
    vector < vector < char >> sq;
    vector < vector < char >> nsq;
    for (i = 0; i<pow(n, 2); i++){  //read into sq
        fin >> c;
        x = i%n;
        y = i / n;
        sq[y][x] = c;
    }
    for (i = 0; i<pow(n, 2); i++){  //read into asq
        fin >> c;
        x = i%n;
        y = i / n;
        nsq[y][x] = c;
    }
    if (isequal(r90(sq,n),nsq,n)==true){    //90 degree rotation
        min = 1;
    }
    if (isequal(r90(r90(sq, n), n), nsq, n) == true && 2<min){    //180 degree rotation
        min = 2;
    }
    if (isequal(r90(r90(r90(sq, n), n), n), nsq, n) == true && 3 < min){    // 270 degree rotation
        min = 3;
    }
    if (isequal(reflect(sq, n), nsq, n) == true && 4<min){    //reflection
        min = 4;
    }
    vector < vector < char >> asq = reflect(sq, n);    
    if (isequal(r90(asq, n), nsq, n) == true && 5<=min){    //reflection+90 degrees rotation
        min = 5;
    }
    if (isequal(r90(r90(asq, n), n), nsq, n) == true && 5 <= min){    //reflection+180 degrees rotation
        min = 5;
    }
    if (isequal(r90(r90(r90(asq, n), n), n), nsq, n) == true && 5 < min){    //reflection+270 degrees rotation
        min = 5;
    }
    if (isequal(sq, nsq, n) == true && 6<min){
        min = 6;
    }
    fout << min;
    return 0;
}

错误:

Debug Assertion Failed! 
Program: C:WINDOWSsystem32MSVCP120D.dll
File: c:program files (x86)microsoft visual studio 
12.0vcincludevector
Line:1201
Expression: vector subscript out of range
For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. 
(Press Retry to debug the application)

我已经找了一段时间的矢量下标问题,但找不到它,是别的吗?

此外,我还研究了这个问题:2d矢量下标超出范围,即使下标在范围内但没找到有用的东西。

谢谢!

对不起,如果这是一个糟糕的问题,我尽力了。

您至少有几个错误。当你在

中填充矢量时
vector < vector < char >> sq;
vector < vector < char >> nsq;    
for (i = 0; i<pow(n, 2); i++){  //read into sq
    fin >> c;
    x = i%n;
    y = i / n;
    sq[y][x] = c;
}
for (i = 0; i<pow(n, 2); i++){  //read into asq
    fin >> c;
    x = i%n;
    y = i / n;
    nsq[y][x] = c;
}

sqnsq的大小为0,因此sq[y][x] = c;nsq[y][x] = c;将超出范围。你可以通过在开始填充矢量之前设置矢量的大小来解决这个问题。

看起来你有一个复制粘贴错误在:

vector< vector <char>> r90(vector < vector <char>>q, int n){    //function to rotate by 90 degrees
    vector < vector <char>>rotatedq = q;
    int j, i;
    for (j = 0; j<n; j++){
        for (i = 0; i < n; j++){
                           ^^^ incrementing j infinitely since i never changes
            rotatedq[j][n - i - 1] = q[i][j];
        }
    }
    return rotatedq;
}

马上(可能还有更多的bug)…

你需要大小你的向量或添加元素使用push_back()之类的东西。例如,声明:

vector < vector < char >> sq;

然后在下一个循环中,您在没有sq有任何元素的情况下执行此操作:

sq[y][x] = c;

这是行不通的——你只是在破坏内存。