最大要素の位置を見つける


83

値の配列の最大要素の位置(値ではない)を返す標準関数はありますか?

例えば:

次のような配列があるとします。

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

sampleArray[3]配列の最大値であることを示す3の整数を返す関数が必要です。

回答:


136

STLでstd::max_element、イテレータを提供します(std::distance本当に必要な場合は、でインデックスを取得するために使用できます)。

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()を使用する時間計算量はどれくらいですか?
Abhipso Ghosh 2017

ドキュメントによると、提供されたイテレータがである場合を除いて、複雑さは直線的にスケーリングしますRandomAccessIterator。そうである場合、時間は一定です。いずれの場合も、最適化は内部で行われます。
スコーチ2017

30

または、1行で書く:

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

配列はクラスタイプではないため、.begin()や.end()などのメンバー関数がないため、これは使用する一般的な構造として質問が示唆する配列では機能しません。十分に新しいコンパイラを使用している場合は、sampleArray.begin()とsampleArray.end()の代わりにstd :: begin(sampleArray)とstd :: end(sampleArray)を使用してコードを適応させることができると思いますが、個人的には、使用されているC ++のバージョンに関係なく実行されるため、受け入れられた回答を好みます
Manjia 2010

6

max_element()関数を使用して、最大要素の位置を見つけることができます。

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_elementシーケンスを区切る2つのイテレータを取り、そのシーケンスの最大要素を指すイテレータを返します。さらに、要素の順序を定義する関数に述語を渡すことができます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.