首页 > 解决方案 > 为什么在抛出“范围错误”实例后调用终止():“范围错误”-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';

      }
  }

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

解决方案


我的观察:

  1. 问题在于:

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

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

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

    返回对指定位置 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. 我认为您不需要将用户输入的所有数字存储在 avector中,因为您只比较用户输入的最后两个值。您可以提出一个不使用向量的更好的实现。


推荐阅读