Vector下标超出c++的范围,无法找到错误的来源
Vector subscript out of range in C++, cannot find source of error
我正在尝试解决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;
}
sq
和nsq
的大小为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;
这是行不通的——你只是在破坏内存。
相关文章:
- 运行时错误:矢量下标超出范围:正在检查空集
- 断言失败错误,C++中的矢量下标超出范围问题
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- 数组下标编译的无效类型'int[int]'由于 -Wfatal 错误而终止
- 尝试对字符串[数组]>>cin 并出现错误(" "字符串下标超出范围")
- 如何修复C++中矢量的"下标超出范围"错误?
- C 向量下标超出范围,没有逻辑错误,无法弄清楚
- C 表达式:向量下标出范围错误线:1733
- 我的程序正在抛出一个错误,声称Vector下标超出了范围.(C )
- Stroustrup的代码审查-编程原理-Ch-4-问题:3-错误:矢量下标超出范围
- 错误:数组下标'double*[double]'的类型无效
- 数组下标错误的类型无效
- 断言错误,字符串下标超出范围
- 字符串下标超出范围错误"C++"
- 在代码块错误中收到此错误:数组下标'main()::fields[int]'的类型无效
- 错误字符串下标超出c++范围
- 矢量下标超出范围错误-如何修复此SPECIFIC错误
- C++ 2d 矢量下标超出范围错误
- 矢量下标超出范围错误,C++,冒泡排序
- 矢量下标超出范围错误