Maksimum elemanın konumunu bulmak


83

Bir değerler dizisinin maksimum öğesinin konumunu (değerini değil) döndüren standart bir işlev var mı?

Örneğin:

Bunun gibi bir dizim olduğunu varsayalım:

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

Bunun sampleArray[3]dizideki en büyük değer olduğunu söyleyen 3 tamsayısını döndüren bir işlev istiyorum .

Yanıtlar:


136

STL olarak, std::max_element(ile endeksini hesaplamak için kullanılabilir yineleyici sağlar std::distanceEğer gerçekten istiyorsan,).

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

5
Distance () işlevini kullanmanın zaman karmaşıklığı nedir?
Abhipso Ghosh

Dokümanlara göre , sağlanan yineleyici a olmadığı sürece karmaşıklığı doğrusal olarak ölçeklenir RandomAccessIterator, bu durumda zaman içinde sabittir. Her durumda, optimizasyon sizin için dahili olarak yapılır.
Scorch

30

Veya tek satırda yazılır:

std::cout << std::distance(sampleArray.begin(),std::max_element(sampleArray.begin(), sampleArray.end()));

Diziler sınıf türleri olmadığından ve bu nedenle .begin () veya .end () gibi üye işlevleri bulunmadığından, sorunun kullanılacak genel yapı olarak önerdiği dizilerle çalışmaz. Yeterince yeni bir derleyici kullanıyorsanız, kodunuzu sampleArray.begin () ve sampleArray.end () yerine std :: begin (sampleArray) ve std :: end (sampleArray) kullanarak uyarlayabileceğinizi düşünüyorum. kişisel olarak kabul edilen yanıtı, hangi C ++ sürümü kullanılırsa kullanılsın çalışacağı için tercih edin
Manjia

6

max_element()Maksimum öğenin konumunu bulmak için işlevi kullanabilirsiniz .

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

0

std::max_elementbir diziyi sınırlayan iki yineleyici alır ve bu sıradaki en büyük öğeyi gösteren bir yineleyici döndürür. Ek olarak, öğelerin sırasını tanımlayan işleve bir dayanak aktarabilirsiniz.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.