C++ C++;生成向量的最小和最大函数

C++ C++;生成向量的最小和最大函数,c++,vector,iterator,C++,Vector,Iterator,我正试图为一个向量的二重子建立一个最小和最大函数。 我使用迭代器遍历向量以找到最小值和最大值。但是,如果我试图返回的值位于列表的末尾,则函数不会返回它。 我在ostream操作符上使用了相同的for循环,它工作得很好,但是它不适用于这些函数。我错过什么了吗 double maximum() { double maximum; typedef vector<double>::const_iterator iter; for(iter i = this->g

我正试图为一个向量的二重子建立一个最小和最大函数。 我使用迭代器遍历向量以找到最小值和最大值。但是,如果我试图返回的值位于列表的末尾,则函数不会返回它。 我在ostream操作符上使用了相同的for循环,它工作得很好,但是它不适用于这些函数。我错过什么了吗

double maximum() {
    double maximum;
    typedef vector<double>::const_iterator iter;
    for(iter i = this->get_data().begin(); i != this->get_data().end(); ++i) {
        if (*i > maximum) {
             maximum = *i;

        } else {
             return maximum;
        }
    }
}
双倍最大值(){
双倍最大值;
typedef向量::常量迭代器iter;
对于(iter i=this->get_data().begin();i!=this->get_data().end();++i){
如果(*i>最大值){
最大值=*i;
}否则{
返回最大值;
}
}
}

旁注:get_data函数是我在该方法所在的类中创建的函数,它返回一个双精度向量

为此有定义良好的算法:-

std::min_element
std::max_element

代码出错,请删除
else
子句,并将
return
移动到
for
循环之后

double maximum() {
    double maximum; // need to initialize this as well
    typedef vector<double>::const_iterator iter;
    for(iter i = this->get_data().begin(); i != this->get_data().end(); ++i) {
        if (*i > maximum) {
             maximum = *i;
        }
    }
    return maximum;
}
双倍最大值(){
最大值加倍;//还需要初始化该值
typedef向量::常量迭代器iter;
对于(iter i=this->get_data().begin();i!=this->get_data().end();++i){
如果(*i>最大值){
最大值=*i;
}
}
返回最大值;
}
您可以使用第一个元素作为初始值,并假设
向量
为非空。如果这样做,还可以从第二个元素开始循环

否则,您还没有定义空
向量上的行为。您还可以将
最大值
初始化为负无穷大或
minu DOUBLE
并且不假设向量为空。此值还等效于
std::numeric\u limits::min()

无论何时编写循环,最好考虑要维护的不变量。在这种情况下,变量是由
i
指向的向量的元素。不变量是
最大值
包含向量的最大值。一旦你大声说出来,很明显空向量必须作为特例处理。空向量的最大值是多少?我不知道。它是未定义的。我们可以创建一个值,但这应该被记录下来。或者,这可能是一个错误。一旦您决定了如何处理这种情况,显然您必须处理所有元素以了解最大值。因此,您不能提前退出循环。这就是为什么返回的
是错误的

下一步是确定哪个元素最大。这部分你基本上是对的。当
*i
大于
最大值时,您有一个新的最大元素。因此,您需要一个条件检查和赋值


对您编写的每个循环进行这种类型的分析将为您节省许多bug。

我将在前言中说,在生产代码中,我将始终使用这种类型的分析,以避免在实现中遇到类似您所面临的问题。不过,将此作为学习练习是一个好主意!这里的问题是报税表放错了地方:

#include <limits>
double maximum() {
    double maximum = std::numeric_limits<double>::min();//This is important
    typedef vector<double>::const_iterator iter;
    for(iter i = this->get_data().begin(); i != this->get_data().end(); ++i) {
        if (*i > maximum) {
            maximum = *i; 
        } else {
            // the first time you get a number less than the
            // current maximum you are returning immediately!
            return maximum;
        }
    }
    //return maximum should be here
}
#包括
双倍最大值(){
double max=std::numeric_limits::min();//这很重要
typedef向量::常量迭代器iter;
对于(iter i=this->get_data().begin();i!=this->get_data().end();++i){
如果(*i>最大值){
最大值=*i;
}否则{
//第一次得到的数字小于
//您将立即返回当前最大值!
返回最大值;
}
}
//返回最大值应该在这里
}
删除整个else分支(这是不必要的),并在for循环检查完所有元素后将返回移动到。 此外,您还希望将maximum初始化为可以存储在double中的最小数字,这里有帮助。当前您正在使用
最大值
,但没有先为其赋值,因此如果存储在
最大值
中的值大于您的元素,则会得到错误的结果。不要把这留给机会,总是初始化变量。

  • 首先,您需要初始化最大变量。好的 值将是向量的第一个元素
  • 而else的陈述是不必要的,也是非常错误的。从for循环中删除它, 并将返回移动到函数末尾。否则它就会回来 第一个值,该值不高于 向量

使用
std::min_元素
std::max_元素
变量
max
未初始化。最好将它设置为非常小的值。谢谢你的帮助,但我确实知道这些,但我想看看我是否能自己制作=)@NickKaraolis嗯。。。我在这段代码中看到了一个潜在的缺陷,超出了最大值。
get_data()
到底做什么?你能把它寄出去吗?如果它按值返回一个向量,那么你就有麻烦了…@PaulMcKenzie const vector&get_data()const{return samp;}@marsh-但是没有提到OP知道算法函数,可能会很高兴他们不必重新发明轮子。我知道这些函数,我只是想试着不用它们来做。谢谢你的提醒。另外,初始化最大值。@shuttle87是的,这确实起到了作用,谢谢你的提醒help@mguerri,说得很好!我第一次没注意到,所以我修改了这个问题。