C ++为向量制作最小和最大函数

时间:2014-11-26 16:55:07

标签: c++ vector iterator

我正在尝试为双精度矢量开发最小和最大函数。 我正在使用迭代器遍历向量来查找最小值和最大值。但是,如果我尝试返回的值位于列表的末尾,则我的代码可以正常工作,该函数不会返回它。 我在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;
        }
    }
}

旁注:get_data函数是我在该类中创建的函数,该函数返回双精度矢量

4 个答案:

答案 0 :(得分:2)

我将在前言中说,在生产代码中,我总是使用std::min_elementstd::max_element来避免实施中遇到的问题。尽管如此,这样做是一个学习练习!你在这里遇到的问题是回报在错误的地方:

#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
}

删除整个else分支(这是不必要的)并在for循环检查完所有元素之后将返回移动到。 您还希望将最大值初始化为可以存储在double中的最小数量,numeric_limits在这里有帮助。目前您正在使用maximum而没有先为其分配值,因此如果恰好存储在maximum中的值大于您的元素,那么您将得到错误的结果。不要忘记这一点,总是初始化你的变量。

答案 1 :(得分:1)

为此目的有明确定义的算法: -

std::min_element
std::max_element

答案 2 :(得分:1)

您的代码错误地删除了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;
}

您可以使用第一个元素作为初始值,并假设vector非空。如果你这样做,你也可以在第二个元素开始循环。

否则,您尚未定义空vector上的行为。您还可以将maximum初始化为负无穷大或MIN_DOUBLE,并且不假设向量为空。该值也等同于std::numeric_limits<double>::min()

无论何时编写循环,最好考虑要维护的不变量。在这种情况下,变体是i指向的向量的元素。不变量是maximum包含向量的最大值。只要你大声说出来,很明显空矢量必须作为特殊情况处理。空矢量的最大值是多少?我不知道。这是未定义的。我们可以组成一个值,但应该记录下来。或者,这可能是一个错误。一旦您决定如何处理这种情况,很明显您必须处理所有元素才能知道最大值。因此,您无法提前退出循环。这就是return错误的原因。

下一步是确定哪个元素是最大的。这部分你大部分是正确的。当*i大于maximum时,您有一个新的最大元素。因此,您需要进行条件检查和分配。

为您编写的每个循环执行此类分析将为您节省许多错误。

答案 3 :(得分:0)

  • 首先,您需要初始化最大变量。一个好的 value将是向量的第一个元素。
  • 比else语句不必要且非常错误。从for循环中删除它, 并将返回移动到函数的末尾。否则它会返回 第一个值不高于其前一个元素 矢量。