寻找最大元素的位置

100
有没有标准的函数可以返回值数组中最大元素的位置而不是其值?
例如:
假设我有一个像这样的数组:
sampleArray = [1, 5, 2, 9, 4, 6, 3]

我想要一个函数,返回数字3的整数值,告诉我sampleArray[3]是数组中最大的值。

6个回答

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

8
使用distance()函数的时间复杂度是多少? - Abhipso Ghosh
根据文档,它的复杂度呈线性比例尺度,除非提供的迭代器是RandomAccessIterator,在这种情况下,时间复杂度是恒定的。无论如何,优化都是内部完成的。 - Scorch

45

或者,写成一行:

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

2
这不适用于数组,问题建议使用数组作为通用结构,因为数组不是类类型,因此它们没有成员函数,例如.begin()或.end()。 如果您正在使用足够新的编译器,我认为您可以通过使用std :: begin(sampleArray)和std :: end(sampleArray)来调整代码,而不是sampleArray.begin()和sampleArray.end(),尽管我个人更喜欢接受的答案,因为它将在使用哪个版本的C ++都可以运行。 - Manjia

9
您可以使用max_element()函数来查找最大元素的位置。
int main()
{
    int num, arr[10];        

    cin >> num;

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

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

    return 0;
}

1

std::max_element接受两个迭代器来分隔一个序列,并返回指向该序列中最大元素的迭代器。您还可以向该函数传递一个谓词,用于定义元素的排序方式。


0
cout<<max_element(arr.begin(), arr.end()) - arr.begin();

1
很抱歉,这并没有为已有的答案增添任何新内容,也没有回答 OP 的问题,而他的问题是关于 C 风格数组的。下次请先阅读现有的答案,并至少浏览一下对它们的评论。 - zkoza
很抱歉让你不高兴。我一直在寻找C++风格的解决方案,但我发现"rashedcs"的解释最适合C风格。我只是借鉴了他的代码片段来用C++编写。 - Gaurav
我并不沮丧 :-) 。对我来说,最像C++的解决方案是std::distance(begin(A), std::max_element(begin(A), end(A))),它适用于C风格的数组和STL容器;对于数组,它可以简化为std::distance(A, max_element(A, A+N)),正如被接受的答案所示。 - zkoza
1
zkoza有一些观点,但无论如何这与现有答案不同 :) - starriet

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接