首页 > 解决方案 > C++ 查找数组中最大元素的索引,即使有多个最大元素

问题描述

我找到了一种方法来搜索数组中最大元素的索引。但是,当数组具有多个具有相同最大值的元素时,它就不能正常工作。我用来查找索引的方法是 with std::max_element(),但这可能不是解决方案。

#include <iostream>

using namespace std;

int main()
{
    int age[8];
    int num = sizeof(age) / sizeof(int);

    cout << "Type the age from 8 employees\n";
    
    for (int i = 0; i < 8; i++)
    {
        cout << "Age " << i+1 << ": ";
        cin >> age[i];
    }
    cout << "______________________________________________________" << endl;   
    cout << "\nOlder age found in position: " << max_element(age, age + num + 1) - age;

我希望我能解决这个问题,int array[]因为我几天前开始编程,但如果我必须使用另一种类型的数组,请告诉我,这样我就可以去了解它。

标签: c++arrays

解决方案


您的程序的问题是 的第二个参数max_element(),它应该是指向传递最后一个元素的指针。它应该是age + 8&age[8], 8 是数组的大小。根据需要,两者都是传递数组最后一个元素的地址。在 C++ 中,last或者end是传递最后一个值。

这是一个如何使用max_element()指针的简化示例。为了使它更简单,我用值初始化了几个数组,而不是像你正在做的那样从标准输入中读取它们:

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int age_uniq[8] = {67, 34, 22, 54, 78, 49, 4, 9};
    int age_rep[8] = {79, 34, 22, 54, 78, 49, 79, 9};
    
    int* oldest = max_element(age_uniq, age_uniq+8);
    cout << "oldest: " << *oldest << ", index = " << oldest - age_uniq << "\n";
    
    oldest = max_element(age_rep, age_rep+8);
    cout << "oldest: " << *oldest << ", index = " << oldest - age_rep << "\n";
}

此代码按预期工作,当它有多个最大值时,它返回第一个。

首先要注意的是它max_element()返回一个前向迭代器,在这种情况下是一个整数指针,因为这是你传递给它的。

您需要学习的第二件事是指针算术。当您减去两个相同类型的指针时,在这种情况下是指向 int 的指针,它已经考虑了整数的大小,并给出了指针之间的距离。因此,oldest - age为您提供最旧的索引。

此外,还sizeof(age)为您提供指针的大小(以字节为单位),这取决于您运行程序的系统可能是 32、64 或其他值。它不是您的数组的大小,在本例中为 8。同样,sizeof(int)它为您提供一个 int 的大小,这取决于您运行程序的系统。


推荐阅读