c++ - 使用插入方法时,C++ 中的向量出现 OUTOFRANGE 错误
问题描述
使用插入方法时,我在 C++ 中遇到向量的 OUTOFRANGE 错误。我不知道为什么会这样,但我能够通过调试将问题缩小到一行。这是完整的代码。
//
#include <cstdio>
#include <iostream>
#include <vector>
#include <fstream>
#include <cassert>
#include <string>
using namespace std;
class suffixArray{
public: suffixArray(std:: string concatenated ){
vector<int> attempt1;
const int size = (int)concatenated.length();
int rank[7] = {};
char *suffixPointers[concatenated.length()];
int value[concatenated.length()];
for(int i =0; i <= size-1; i++){
suffixPointers[i] = &concatenated[i];
value[i] = (int)concatenated[i];
}
std::cout << "[";
for(int i = 0; i<= size-1; i++){
std::cout <<value[i] << " ";
}
std::cout << "]"<< std:: endl;
for(int i = 0; i<=size -1; i++){
if(i == 0){
rank[i] = i;
attempt1.push_back(i);
}
else if(value[i] > value[i-1]){
rank[i] = i;
attempt1.push_back(i);
}else{
int current =i;
int savedValue = value[i];
int prevSavedRank;
int indexcounter = i;
while(savedValue <= value[attempt1.at(indexcounter-1)] && indexcounter - 1 >= 0 ){
indexcounter--;
}
cout << indexcounter << endl;
attempt1.insert(attempt1.begin() + indexcounter ,i);
// while(savedValue <= value[rank[current-1]] && current-1 >= 0){
// prevSavedRank= rank[current-1];
// rank[current-1] = i;
// rank[current] = prevSavedRank;
// current--;
// }
}
}
int now;
for(int i = 0; i<= 3; i++){
now = attempt1[i];
std::cout << now << " ";
}
}
};
void read_file(string filename, string& contents, int& num_lines){
ifstream f;
f.open(filename.c_str());
string line;
contents = "";
num_lines = 0;
while(getline(f, line)){
contents.append(line.substr(0, line.length()));
num_lines++;
}
f.close();
}
int main(int argc, const char* argv[]) {
std:: string test = "BANANA$";
suffixArray testString (test);
string fn;
string contents;
int num_lines;
cout << "File 1:" << endl;
cin>> fn;
read_file(fn, contents, num_lines);
cout << "Read: " << fn << "\n";
cout << " * " << num_lines << " lines\n";
cout << " * " << contents.length() << " characters (excluding newlines)\n";
//cout <<" * " << contents << endl;
// char * contents_cstring = (char*)contents.c_str();
//for(int i =0; i< contents.length(); i++){
// assert(contents_cstring[i] == *(contents_cstring + 1));
// assert(contents_cstring[i] == contents.at(i));
//}
//assert(contents_cstring[contents.length()] == '\0');
return 0;
}
我已将问题缩小为来自这条线的问题,但无法弄清楚它为什么会发生,或者如何解决它。
尝试1.插入(尝试1.开始()+索引计数器,i);
解决方案
考虑程序第一次到达
int indexcounter = i;
while(savedValue <= value[attempt1.at(indexcounter-1)] && indexcounter - 1 >= 0){
indexcounter--;
}
i
将是 1.indexcounter-1
将是 0. 如果进入循环,
int indexcounter = 1;
while(savedValue <= value[attempt1.at(0)] && 0 >= 0 ){
1--;
}
好的,那么下次会发生什么?
while(savedValue <= value[attempt1.at(-1)] && -1 >= 0 ){
0--;
}
value[attempt1.at(-1)]
发生在 -1 >= 0 之前,s 防止 -1 的陷阱失败。颠倒测试的顺序。
while(indexcounter - 1 >= 0 && savedValue <= value[attempt1.at(indexcounter-1)])
可能是更多错误,但之后程序挂起并要求我没有的文件。
推荐阅读
- reactjs - 我如何通过反应组件上的.net核心获取会话数据
- reactjs - 为什么我在 react.js 的 setState 回调中得到旧的状态值
- r - group() id 的组内条目之间的数据差异为 1 个月
- python - 如何使用目录将 xlsx 文件导入 Jupiter 笔记本?
- bootstrap-4 - 引导程序 4:隐藏 btn 组
- javascript - 如何在 Bootstrapvalidator 中验证用逗号或半克隆分隔的多个电子邮件的电子邮件输入字段
- flutter - 将两个双精度值相乘会在颤动中给出负数
- elasticsearch - 如何在 Kibana 的饼图中显示值而不是百分比?
- python - 如何从 multiprocessing.Process 调用的函数返回数据?(Python3)
- json - 将vector3的列表转换为Json