我不知道为什么编译器返回此错误。我搜索了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';
}
}
我的观察:
问题出在行:
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
的值而执行。这可能是您的索引检查机制无法按预期工作的原因。
我认为您不需要将用户输入的所有数字都存储在vector
中,因为您仅比较用户输入的最后两个值。您可以提出一个更好的实现,该实现不使用向量。
让我们修复缩进:
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;
。