【问题标题】:Why terminate is called after throwing an instance of 'range error' what(): 'Range Error' -1为什么在抛出“范围错误”实例后调用终止():“范围错误”-1
【发布时间】:2020-08-12 05:48:06
【问题描述】:

我不知道为什么编译器会返回这个错误。我搜索了谷歌,但没有找到任何东西。

#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';

      }
  }

【问题讨论】:

  • 为什么要使用double 值作为索引?那只是自找麻烦。 vector_sizetwood_ev 都应该是 int(或 unsigned
  • 欢迎来到 SO!请参阅“How to Ask”、“Stack Overflow question checklist”和“MCVE”及其所有链接页面。另外,我强烈推荐阅读“How To s The Smart Way”。我们不在乎你的经历是什么,这真的不重要。我们非常关心您是否已经完成了研究并付出了努力,然后您提出了一个好问题。

标签: c++ c++11 atom-editor


【解决方案1】:

让我们修复缩进:

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';

如果您不使用{},那么if 的主体只是一个语句,因此您在第一次迭代中访问了越界向量。

为了说明,考虑一下:

if (number.size() > 1) 
     std::cout << number.size();
     std::cout << number[0];

正确的格式是:

if (number.size() > 1) 
    std::cout << number.size();
std::cout << number[0];

而且可能应该是:

if (number.size() > 1) {
    std::cout << number.size();
    std::cout << number[0];
}

我发现您的vector_size 相当混乱。使用numbers.size()(它具有恒定的复杂性,不像人们预期的那样是线性的)。当您不能 100% 确定仅访问有效索引时,还可以使用向量 at 方法进行更好的诊断。

也不要使用double 作为索引,double two = 2; 是完全不行的。如果你真的想要two,那么至少要设置为const,这样two = 3; 是不可能的。

【讨论】:

    【解决方案2】:

    我的观察:

    1. 问题出在一行:

      numbers[vector_size-1] > numbers[vector_size - 2]
      

      在 for 循环的第一次迭代中,vector_size 可能是 1,vector_size - 2 可能是 -1。您需要处理这种情况,并且不允许访问 [0, vector.size()) 之外的任何元素。

    2. 您可以简单地使用unsigned 作为索引变量的数据类型。也就是说,vector_size 应该是无符号的。另外,您应该考虑使用vector 类的at 方法。

      返回对指定位置 pos 的元素的引用,并进行边界检查。如果 pos 不在容器的范围内,则抛出 std::out_of_range 类型的异常。

    3. 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 的值无关。这可能是您的索引检查机制未按预期工作的原因。

    4. 我认为您不需要将用户输入的所有数字存储在vector 中,因为您只比较用户输入的最后两个值。你可以想出一个更好的不使用向量的实现。

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多