zoukankan      html  css  js  c++  java
  • STL中区间最值max_element和min_element的用法

    前面的博客已经讲解了nth_element寻找区间第K大的用法,现在我们来说说这两个找区间最值的用法。两个函数都包含在algorithm库中。

    一、函数原型

    • max_element

    1 template< class ForwardIt >
    2 ForwardIt max_element(ForwardIt first, ForwardIt last );
    3 template< class ForwardIt, class Compare >
    4 ForwardIt max_element(ForwardIt first, ForwardIt last, Compare comp );
    • min_element
    1 template< class ForwardIt >
    2 ForwardIt min_element( ForwardIt first, ForwardIt last );
    3 template< class ForwardIt, class Compare >
    4 ForwardIt min_element( ForwardIt first, ForwardIt last, Compare comp );

    1.参数

      first,end——区间范围

      comp——自定义比较函数

    顾名思义,max_element就是求区间最大值,而min_element就是求区间最小值。当然也可以自定义比较函数达到自己想要的“最大值”或者“最小值”

    二、代码演示

    1 #include <bits//stdc++.h>
    2 using namespace std;
    3 
    4 int main(){
    5     int a[] = {1,2,3,4,5};
    6     int maxa = max_element(a,a+5), mina = min_element(a,a+5);
    7     cout << maxa << ' ' << mina << endl;
    8     return 0;
    9 }

    预计上面代码输出为5 1,但是最终却编译错误。Why?

    因为这两个函数返回的是最大值或者最小值的迭代器,所以我们得加上一个*号得到值,最终代码如下:

     1 #include <bits//stdc++.h>
     2 using namespace std;
     3 
     4 int main(){
     5     int a[] = {1,2,3,4,5};
     6     int maxa = *max_element(a,a+5), mina = *min_element(a,a+5);
     7     cout << maxa << ' ' << mina << endl;
     8     return 0;
     9 }
    10 
    11 /**运行结果
    12 5 1
    13 */

    三、手动实现

    这两个函数手动实现就很简单了,直接遍历一遍找最值即可,这里贴一下cppreference上的源码实现:

     1 //版本一
     2 template<class ForwardIt>
     3 ForwardIt max_element(ForwardIt first, ForwardIt last)
     4 {
     5     if (first == last) {
     6         return last;
     7     }
     8     ForwardIt largest = first;
     9     ++first;
    10     for (; first != last; ++first) {
    11         if (*largest < *first) {
    12             largest = first;
    13         }
    14     }
    15     return largest;
    16 }
    17 
    18 //版本二
    19 template<class ForwardIt, class Compare>
    20 ForwardIt max_element(ForwardIt first, ForwardIt last, 
    21                       Compare comp)
    22 {
    23     if (first == last) {
    24         return last;
    25     }
    26     ForwardIt largest = first;
    27     ++first;
    28     for (; first != last; ++first) {
    29         if (comp(*largest, *first)) {
    30             largest = first;
    31         }
    32     }
    33     return largest;
    34 }

    四、复杂度分析

    比较n-1次,n是区间长度,时间负责度为O(n)。

  • 相关阅读:
    Opencv中cvCopy()和cvCloneImage()的区别(转)
    什么是DC?
    UpdateDate()函数的作用
    宏定义函数指针类型【转】
    将openCV中的IplImage格式的图片显示到Picture控件上
    C程序调用shell脚本共有三种方法
    memset ,memcpy ,memmove,strcpy 的根本区别 与实现
    sizeof strlen length()
    itoa 实现
    string 与 char * 转换
  • 原文地址:https://www.cnblogs.com/xenny/p/10195292.html
Copyright © 2011-2022 走看看