【问题标题】:Finding the position of the maximum element找到最大元素的位置
【发布时间】:2011-02-26 13:33:32
【问题描述】:

是否有标准函数返回值数组的最大元素的位置(不是值)?

例如:

假设我有一个这样的数组:

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

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

【问题讨论】:

    标签: c++ algorithm


    【解决方案1】:

    std::max_element 采用两个迭代器来界定一个序列,并返回一个指向该序列中最大元素的迭代器。您还可以将谓词传递给定义元素顺序的函数。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 使用函数distance()的时间复杂度是多少?
      • 根据docs,它的复杂度呈线性变化除非提供的迭代器是RandomAccessIterator,在这种情况下它是时间常数。无论如何,优化都是在内部为您完成的。
      【解决方案3】:

      STL 有一个 max_elements 函数。 这是一个例子:http://www.cplusplus.com/reference/algorithm/max_element/

      【讨论】:

        【解决方案4】:

        您可以使用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;
        }
        

        【讨论】:

          【解决方案5】:

          或者,写成一行:

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

          【讨论】:

          • 这不适用于数组,问题建议将其用作要使用的通用结构,因为数组不是类类型,因此它们没有成员函数,例如 .begin() 或 .结尾()。我认为如果您使用的是足够新的编译器,则可以使用 std::begin(sampleArray) 和 std::end(sampleArray) 而不是 sampleArray.begin() 和 sampleArray.end() 来调整代码,尽管我个人更喜欢接受的答案,因为无论使用哪个版本的 C++,它都会运行
          猜你喜欢
          • 2018-09-13
          • 2013-11-21
          • 1970-01-01
          • 1970-01-01
          • 2021-06-04
          • 2021-11-17
          • 2023-03-26
          • 2015-06-02
          • 1970-01-01
          相关资源
          最近更新 更多