获取两个最大值的索引



我得到了一个像myArray[4] = { 10, 3, -5, 30 };这样的数组,我想获取它的两个元素的索引,具有最大值(在本例中为30, 10元素(,并且30的索引是3,而10的索引是0(当然是从零开始(。

因此,结果应该是{3, 0},因为最大元素 (30.0( 的索引为 3,第二大元素 (10.0( 的索引为 0。


如何为问题实施一个简单的工作解决方案?

double myArray[4] = { 10, 3, -5, 30 };
double biggestElement_1 = *std::max_element(std::begin(myArray), std::end(myArray));
int biggestElement_1_indx = find(std::begin(myArray), std::end(myArray), biggestElement_1) - std::begin(myArray);
cout << biggestElement_1_indx << endl;
// How to go on to find the second biggest element ?

注意:我显然是新手C++很抱歉(愚蠢的(初学者问题 - 但是:任何帮助将不胜感激。:)

您可以使用vector of pairs将数组与其索引一起保存,然后根据值对它们进行排序,并根据需要返回最大值,如下所示

#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
int main() {
double myArray[4] = { 10, 3, -5, 30 };
vector<pair<double, double > >vec;
for(int i=0;i<4;i++){
vec.push_back(make_pair(myArray[i],i));
}
sort(vec.begin(), vec.end());
for(int i=0;i<vec.size();i++){
cout<<vec[i].first<<" "<<vec[i].second<<endl;
}
cout<< vec[vec.size()-1].second<< ", "<<vec[vec.size()-2].second;
}

你不能用<algoritm>的函数轻易找到两个最大值的索引(当然,除非你可以改变数组(。你最好自己动手。

template <class InputIt>
auto two_biggest(InputIt begin, InputIt end)
{
auto result = std::make_tuple(0, 0);
// iter in [begin; end) and save result.get<0> and result.get<1>
// let as an exercise (it's an exercise, right?)
return result;
}

然后,您将能够使用以下方式调用它:

auto t = two_biggest(std::begin(arr), std::end(arr));

或者更好的是,使用 C++17 元组解包:

[largest, second_largest] = two_biggest(std::begin(arr), std::end(arr));

或者对于 C++17 之前:

int largest, second_largest;
std::tie(largest, second_largest) = two_biggest(std::begin(arr), std::end(arr));

很容易找到数组中的最大值:只需扫描它,并跟踪到目前为止看到的最大值。当你到达终点时,这是最大的价值。

查找第二大值同样简单:当您扫描最大值时,如果发现的值大于到目前为止看到的最大值,那就是新的最大值,到目前为止看到的最大值现在是第二大值。

在代码中:

std::pair<int, int> get_two_largest(int* ptr, int size) {
int largest = std::numeric_limits<int>::min();
int second_largest;
for (int i = 0; i < size; ++i)
if (largest <= ptr[size]) {
second_largest = largest;
largest = ptr[size];
}
return std::pair<int, int>(largest, second_largest);
}

我使用<=进行比较,因为对于纯<(这是我用来查找最大值的(,该函数将为具有所有相等值的数组返回错误结果。

最新更新