Получить индекс двух самых больших значений - PullRequest
0 голосов
/ 11 мая 2018

Я получил массив типа 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 ?

Примечание : IЯ, очевидно, новичок в C ++, так что извините за (глупый) вопрос beginner - однако: любая помощь будет очень признательна.:)

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Вы можете использовать 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;
}
0 голосов
/ 11 мая 2018

Легко найти самое большое значение в массиве: просто просмотрите его и отследите самое большое значение, которое вы когда-либо видели. Когда вы достигнете конца, это самое большое значение.

Найти второе по величине значение так же просто: когда вы выполняете сканирование на самое большое значение, если вы находите значение, которое больше, чем наибольшее значение, которое вы когда-либо видели, это новое наибольшее значение, и самое большое значение, которое вы когда-либо видели, теперь является вторым по величине значением.

В коде:

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);
}

Я использовал <= для сравнения, потому что при обычном < (это то, что я бы использовал, чтобы найти наибольшее значение), функция вернула бы неверный результат для массива со всеми равными значениями.

0 голосов
/ 11 мая 2018

Вы не можете легко найти индексы двух самых больших значений с помощью функций <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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...