C++矢量下标超出范围
在编译程序后尝试运行程序时,我不断遇到此错误:C++矢量下标超出范围,c++,string,vector,C++,String,Vector,在编译程序后尝试运行程序时,我不断遇到此错误: vector subscript out of range 我的代码如下: for (int i=1; i<=n; i++) { getline(input, line); istringstream iss(line); iss >> num; while (!iss.eof()) { iss >> o; b.push_back(o); }
vector subscript out of range
我的代码如下:
for (int i=1; i<=n; i++) {
getline(input, line);
istringstream iss(line);
iss >> num;
while (!iss.eof()) {
iss >> o;
b.push_back(o);
}
sort(b.begin(), b.end);
se = b.size();
output << num << " " << b[se-1] << endl;
b.clear();
b.resize(100);
}
那么,问题出在哪里呢?排序b.开始,b.结束
您使用的是b的end函数的地址进行排序,而不是b.end调用时将返回的迭代器,因此排序算法将从向量的末尾脱落,从而导致您报告的“下标超出范围”错误。如果您禁用了迭代器调试,它会比报告错误糟糕得多
这应该是
排序b.开始,b.结束
编辑
您可能还需要检查向量是否为空,因为这是您可以在其边界之外引用的另一个位置:
se = b.size();
if( se > 0 )
output << num << " " << b[se-1] << endl;
排序b.开始,b.结束
您使用的是b的end函数的地址进行排序,而不是b.end调用时将返回的迭代器,因此排序算法将从向量的末尾脱落,从而导致您报告的“下标超出范围”错误。如果您禁用了迭代器调试,它会比报告错误糟糕得多
这应该是
排序b.开始,b.结束
编辑
您可能还需要检查向量是否为空,因为这是您可以在其边界之外引用的另一个位置:
se = b.size();
if( se > 0 )
output << num << " " << b[se-1] << endl;
您将第一个数字存储在num变量的一行中,并仅将后续数字存储在向量中。因此,第一次调用output时,您将第一个数字存储在num变量的一行中,并且只将随后的数字存储在向量中。因此,第一次调用output时,您没有发布自发布代码以来的实际代码 不会编译,而且你也没有给我们任何关于类型的提示 卷入的但是如果num和o是数值类型,而b是 数字类型的向量,并且没有额外的白色 第一行中的3和行尾之间的空间 第一次通过循环,您几乎可以肯定 不输入while,b将为空b.size==0,并且 b[se-1]将尝试访问一些难以置信的大索引 在空数组中 当然,如果num是复杂的,或者其他类型 3不是一个合法的值,你将进入一个无休止的循环 虽然iss.eof。循环的正确形式为:
while ( iss >> o ) {
b.push_back( o );
}
事实上,您使用值o时没有检查是否
实际读取成功可能会导致未定义的行为。自发布代码以来,您尚未发布实际代码 不会编译,而且你也没有给我们任何关于类型的提示 卷入的但是如果num和o是数值类型,而b是 数字类型的向量,并且没有额外的白色 第一行中的3和行尾之间的空间 第一次通过循环,您几乎可以肯定 不输入while,b将为空b.size==0,并且 b[se-1]将尝试访问一些难以置信的大索引 在空数组中 当然,如果num是复杂的,或者其他类型 3不是一个合法的值,你将进入一个无休止的循环 虽然iss.eof。循环的正确形式为:
while ( iss >> o ) {
b.push_back( o );
}
事实上,您使用值o时没有检查是否
实际读取成功可能会导致未定义的行为。问题之一是,我们不知道代码摘录中涉及的大多数类型,或者对这些类型所做的任何处理,或者错误实际发出的位置。您需要b.end而不是b.end。虽然我不知道它是否与您的问题有关,但循环仍然存在!Is.EOF显然不正确,将导致未定义的行为。编译器不应该抱怨调用排序中的参数类型吗?建议的第一位:确保所有警告都在进行,并将任何警告视为错误。在排序行b.begin,b.end;,你在b.end之后省略大括号一定引起了编译器的警告,实际上我有点惊讶它居然能够编译。忽略此警告是您出现在这里并且我们正在努力调试您的代码的原因之一。问题之一是我们不知道代码摘录中涉及的大多数类型,或者对这些类型所做的任何操作,或者该错误实际上是在哪里发出的。您需要b.end而不是b.end。虽然我不知道它是否与您的问题有关,但循环仍然存在!Is.EOF显然不正确,将导致未定义的行为。编译器不应该抱怨调用排序中的参数类型吗?建议的第一位:确保所有警告都在进行,并将任何警告视为错误。在排序行b.begin,b.end;,你在b.end之后省略大括号一定引起了编译器的警告,实际上我有点惊讶它居然能够编译。忽略此警告是您出现在这里并且我们正在努力调试您的代码的原因之一。这是一样的。。我试过了。。我把向量下标保持在范围之外Sort b.begin,b.end不应该编译。他说他在运行程序时遇到了一个边界错误,所以他显然没有发布错误
实际代码。@benjymous。。。非常感谢。这就解决了问题@解决其中一个问题的用户2973413。您的while循环仍然有未定义的行为,尽管它可能在大部分时间都有效。如果文件包含一些非法输入,它将进入无休止的循环,如果最后一个值和行尾之间有空格,它将推回一个可能未初始化的值。这是一样的。。我试过了。。我把向量下标保持在范围之外Sort b.begin,b.end不应该编译。他说他在运行程序时遇到了一个边界错误,所以他显然没有发布实际的代码。@benjymous。。。非常感谢。这就解决了问题@解决其中一个问题的用户2973413。您的while循环仍然有未定义的行为,尽管它可能在大部分时间都有效。如果文件包含一些非法输入,它将进入无休止的循环,如果最后一个值和行尾之间有空格,它将推回一个可能未初始化的值。更清楚地说,触发问题的是输入文件的第一行。触发问题的是输入文件的第一行,更清楚地说,谢谢你,伙计。。这是实际的代码,但我在做排序b.begin,b.begin+b.size,我只是用b.end替换了它,忘了谢谢你。。这是实际的代码,但我正在做排序b.begin,b.begin+b.size,我只是用b.end替换了它,然后忘记了