如何在不使用c ++的容器的情况下打印5个值的最大索引?

时间:2018-04-21 05:50:26

标签: c++

5个值的索引以1开头,我的任务是打印具有最大值的索引。我已经尝试过以下代码:

#include <iostream>
using namespace std;

int main()
{
    int  a, b, c, d, e;
    cin >> a >> b >> c >> d >> e;
    int cnt = 1;
    if (a < b){
        a = b;
        cnt++;
    }
    if (a < c){
        a = c;
        cnt++;
    }
    if (a < d){
        a = d;
        cnt++;
    }
    if (a < e){
        a = e;
        cnt++;
    }
    cout << cnt;

}

有没有办法将我的代码简化为更少的行,例如,或者更有效的方式,假设所有值都是&gt; = 0

3 个答案:

答案 0 :(得分:5)

这是一个提议的解决方案,它不使用容器,只使用STL算法和迭代器魔法。它也适用于输入的任意数量的数字,而不仅仅是5。

#include <algorithm>
#include <iterator>
#include <iostream>
#include <climits>

int main()
{
    int maxv = std::numeric_limits<int>::min();
    int high_index;
    int curIndex = 1;
    std::for_each(std::istream_iterator<int>{std::cin}, 
                  std::istream_iterator<int>{}, [&](int n) 
                  { 
                    if (maxv < n)
                    {
                        high_index = curIndex;
                        maxv = n;
                    }
                    ++curIndex; 
                });
    std::cout << "Highest index: " << high_index;
}

Live Example

答案 1 :(得分:3)

我的C ++不好,所以将这个答案视为伪代码:

cnt++

答案 2 :(得分:0)

您可以考虑使用drop table if exists t; create table t(id int, p_id int, payout_date date); insert into t values (1 , 2 , '2018-04-21'); select id,p_id,payout_date from t union select id,p_id,date_add(payout_date,interval 1 month) from t; +------+------+-------------+ | id | p_id | payout_date | +------+------+-------------+ | 1 | 2 | 2018-04-21 | | 1 | 2 | 2018-05-21 | +------+------+-------------+ 2 rows in set (0.00 sec)

std::max

我认为它不会比一系列if语句好得多,而不会实际使用数组。

请注意,上面的代码将输出最大数字的 last 实例的索引:如果列表为if ((a = std::max(a, b)) == b) { cnt = 2; } if ((a = std::max(a, c)) == c) { cnt = 3; } if ((a = std::max(a, d)) == d) { cnt = 4; } if ((a = std::max(a, e)) == e) { cnt = 5; } ,则输出(5, 5, 5, 5, 1)。如果您想要最大数字的第一个实例,那么原始代码(适当替换4)可能已经是最清晰的解决方案。此外,恕我直言,你的解决方案可以说比我刚写的更清楚。