c++ - 为什么在抛出“范围错误”实例后调用终止():“范围错误”-1
问题描述
我不知道为什么编译器会返回此错误。我搜索了谷歌,但我没有找到任何东西。
#include"std_lib_facilities.h"
int main()
{
vector<double>numbers;
cout<<"Enter any two numbers:\n";
double two_numbers;
//loop
while(cin>>two_numbers){
numbers.push_back(two_numbers);
double vector_size = numbers.size();
double two = 2;
double formula_equal = 1.0/100;
double od_ev = fmod(vector_size , two);
//checking the conditions
if(od_ev == 0)
if(numbers[vector_size-1] > numbers[vector_size - 2])
cout<<"The larger value is: "<<numbers[vector_size - 1]<<'\n'
<<"The smaller value is: "<<numbers[vector_size - 2]<<'\n';
if(numbers[vector_size-1] - numbers[vector_size - 2] < formula_equal)
cout<<"These numbers are almost equal.";
else if(numbers[vector_size-1] < numbers[vector_size - 2])
cout<<"The larger value is: "<<numbers[vector_size - 2]<<'\n'
<<"The smaller value is: "<<numbers[vector_size - 1]<<'\n';
if(numbers[vector_size-2] - numbers[vector_size - 1] < formula_equal)
cout<<"these numbers are almost equal.";
else if(numbers[vector_size-1] == numbers[vector_size - 2])
cout<<numbers[vector_size-1]<<" is equal to "<<numbers[vector_size - 2]<<'\n';
}
}
解决方案
我的观察:
问题在于:
numbers[vector_size-1] > numbers[vector_size - 2]
在你的 for 循环的第一次迭代中,
vector_size
可能是 1 并且vector_size - 2
将是 -1。您需要处理这种情况,并且不允许访问[0, vector.size())
.您可以简单地
unsigned
用作索引变量的数据类型。也就是说,vector_size
应该是无符号的。此外,您应该考虑使用at类方法vector
。返回对指定位置 pos 的元素的引用,并进行边界检查。如果 pos 不在容器的范围内,则抛出 std::out_of_range 类型的异常。
{}
在语句下的多行语句周围使用大括号是一种很好的做法,if
并且有必要在多个语句周围放置大括号,这些语句只有在if
条件变为true
. 您期望您的代码只有在为零if(od_ev == 0)
时才会执行。od_ev
但是,编译器只考虑以下语句:if(numbers[vector_size-1] > numbers[vector_size - 2]) cout << "The larger value is: " << numbers[vector_size - 1] << '\n' << "The smaller value is: " << numbers[vector_size - 2] << '\n';
成为
if
语句的一部分,其余语句将被执行,而与od_ev
' 值无关。这可能是您的索引检查机制未按预期工作的原因。我认为您不需要将用户输入的所有数字存储在 a
vector
中,因为您只比较用户输入的最后两个值。您可以提出一个不使用向量的更好的实现。
推荐阅读
- java - Spring PagingAndSortingRepository 在处理过程中删除条目
- python - 在 Python 中捕获特定 IP 地址集的正则表达式
- r - 没有互联网的应用
- numpy - 你如何在 numpy 中连接几个二维数组?
- python - 在 django 中将 id 字段更改为 slug 字段
- java - OffsetDateTime 格式无效
- redux - 为每个特定的减速器分派多个动作和为多个减速器分派一个动作之间有区别吗?
- android - 如何在 Flutter 中进行 OTP 认证?
- javascript - 如何使用带有数据的动态标题管理 Datatable
- react-native - intelij react-native 错误:无法初始化类 org.codehaus.groovy.runtime.InvokerHelper