Znalezienie pozycji max elementu

83

Czy istnieje standardowa funkcja, która zwraca pozycję (nie wartość) maksymalnego elementu tablicy wartości?

Na przykład:

Załóżmy, że mam taką tablicę:

sampleArray = [1, 5, 2, 9, 4, 6, 3]

Chcę funkcji, która zwraca liczbę całkowitą 3, która mówi mi, że sampleArray[3]jest to największa wartość w tablicy.

Faken
źródło

Odpowiedzi:

136

W STL std::max_elementzapewnia iterator (który może być użyty do pobrania indeksu std::distance, jeśli naprawdę tego chcesz).

int main(int argc, char** argv) {
  int A[4] = {0, 2, 3, 1};
  const int N = sizeof(A) / sizeof(int);

  cout << "Index of max element: "
       << distance(A, max_element(A, A + N))
       << endl;

  return 0;
}
Stephen
źródło
5
Jaka jest złożoność czasowa korzystania z funkcji distance ()?
Abhipso Ghosh
Zgodnie z dokumentacją , jego złożoność skaluje się liniowo, chyba że dostarczonym iteratorem jest a RandomAccessIterator, w którym to przypadku jest stała w czasie. W każdym razie optymalizacja jest wykonywana wewnętrznie za Ciebie.
Scorch
30

Lub napisane w jednej linii:

std::cout << std::distance(sampleArray.begin(),std::max_element(sampleArray.begin(), sampleArray.end()));
Alex
źródło
Nie działa to z tablicami, co sugeruje pytanie jako ogólna struktura do użycia, ponieważ tablice nie są typami klas i dlatego nie mają funkcji składowych, takich jak .begin () lub .end (). Myślę, że możesz dostosować swój kod, używając std :: begin (sampleArray) i std :: end (sampleArray) zamiast sampleArray.begin () i sampleArray.end (), jeśli używasz kompilatora, który jest wystarczająco nowy, chociaż ja osobiście wolę zaakceptowaną odpowiedź, ponieważ działałaby niezależnie od używanej wersji C ++
Manjia
6

Możesz użyć max_element()funkcji, aby znaleźć pozycję elementu max.

int main()
{
    int num, arr[10];
    int x, y, a, b;

    cin >> num;

    for (int i = 0; i < num; i++)
    {
        cin >> arr[i];
    }

    cout << "Max element Index: " << max_element(arr, arr + num) - arr;

    return 0;
}
zrazy
źródło
0

std::max_elementprzyjmuje dwa iteratory ograniczające sekwencję i zwraca iterator wskazujący na maksymalny element w tej sekwencji. Możesz dodatkowo przekazać predykat do funkcji, która określa kolejność elementów.

avakar
źródło