为什么在引发“范围错误” what()实例后调用终止:“范围错误” -1

问题描述 投票:1回答:2

我不知道为什么编译器返回此错误。我搜索了Google,但未找到任何内容。

#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++11 atom-editor
2个回答
4
投票

我的观察:

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


3
投票

让我们修复缩进:

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%仅访问有效索引,也可以使用vectors at方法进行更好的诊断。

也不要使用double作为索引,并且double two = 2;是完全不可行的。如果您确实想要two,则至少要使其为const,这样就不可能使用two = 3;

© www.soinside.com 2019 - 2024. All rights reserved.