找到输入的最大和最小值的最有效方法? (C++)

Most efficient way to find the largest and smallest values entered? (C++)

这是我使用向量的方法(注意:这远非解决此问题的最有效方法):

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char** argv) {

    vector<double>n;

    double val = 0;

    bool turkey = true;

    cout << "Please enter a positive number (max. 1,000,000)" << '\n';

    while(turkey){
        cin >> val;
        if (val >= 0 && val <= 1000000){

            n.push_back(val);

            sort(n.begin(), n.end());

            cout << n[0] << " is the smallest value so far" << '\n';
            cout << n[n.size()-1] << " is the largest value so far" << '\n';

        }
        else {
            turkey = false;
        }
    }
    return 0;
}

查找最大值和最小值的最有效方法是什么?

此外,考虑到输入是双精度数,有没有办法用“|”终止它?

仅供参考:问题来自编程原则与实践。我已经解决了这个问题;只是在寻找一个有效的解决方案。

是的,不用向量也可以解决。
你只需要两(三)个变量

double min, max;  
bool first = true;  

然后

while(turkey) { //turkey?
    cin >> val;
    if(first)
    {
        first = false;
        min = val;
        max = val;
    }
    if(val < min) min = val;
    if(val > max) max = val;

"first"的事情只是一种可能。您可以在循环之前进行单独读取(包括检查“|”),或者您可以使用 min/max 可能的双精度值,...

关于“|”:将输入读取为字符串,检查“|”,否则在检查后将其解析为双精度

这是一个非常简单的方法。

double value, minimum = -1.0, maximum = -2.0;  // note initialisation maximum < minimum
bool valid_input;

do
{
     std::cout << "Please enter a positive number (max. 1,000,000)" << '\n';
     if (!!(valid_input = ((std::cin >> value) && (value > 0.0 && value < 1E6))))
     {
         if (maximum < minimum)
             minimum = maximum = value;
         else if (value < minimum)
             minimum = value;
         else if (value > maximum)
             maximum = value;
     }
}
while (valid_input);

它的一个特点是 value 的范围检查是可选的。用户需要做的就是输入一个非数字非白色字符(然后输入),他们可以强制退出循环(尽管后续代码需要清除 std::cin 的错误条件并读取任何待处理的输入).