max

max.png

最大値を求める様々なことを記す

3つの要素の最大値

#define MAX3(a, b, c) ((a) > (MAX(b, c)) ? (a) : (MAX(b, c)))

3より多い要素の最大値

numpyパッケージを使って簡単に求められます。

import numpy;
fp=open("bigdata.bin","rb");
data=numpy.fromfile(fp,dtype=numpy.uint16);
print("最小値%d,最大値%d"%(numpy.amin(data),numpy.amax(data)));

[[tab C++の自作]]
map<string,int>::iterator mt;
        int maxval=1;//ありうる値の中で一番小さい値を初期値として入れておく。
         for (mt=hash.begin(); mt!=hash.end(); ++mt){
            if(maxval<(mt->second)){
                 maxval=mt->second;
             }
         }
         return maxval;

毎回algorithm.max()を使ってちょっとスッキリさせてみる

map<string,int>::iterator mt;
        int maxval=1;
         for (mt=hash.begin(); mt!=hash.end(); ++mt){
            maxval=max(maxval,mt->second);
         }
         return maxval;

std::algorithm max_element

// min_element/max_element example
#include <iostream>     // std::cout
#include <algorithm>    // std::min_element, std::max_element
 
bool myfn(int i, int j) { return i<j; }
 
struct myclass {
  bool operator() (int i,int j) { return i<j; }
} myobj;
 
int main () {
  int myints[] = {3,7,2,5,6,4,9};
 
  // using default comparison:
  std::cout << "The smallest element is " << *std::min_element(myints,myints+7) << '\n';
  std::cout << "The largest element is "  << *std::max_element(myints,myints+7) << '\n';
 
  // using function myfn as comp:
  std::cout << "The smallest element is " << *std::min_element(myints,myints+7,myfn) << '\n';
  std::cout << "The largest element is "  << *std::max_element(myints,myints+7,myfn) << '\n';
 
  // using object myobj as comp:
  std::cout << "The smallest element is " << *std::min_element(myints,myints+7,myobj) << '\n';
  std::cout << "The largest element is "  << *std::max_element(myints,myints+7,myobj) << '\n';
 
  return 0;
}

出力
The smallest element is 2
The largest element is 9
The smallest element is 2
The largest element is 9
The smallest element is 2
The largest element is 9

要素が沢山あるときはいいかもね。

2要素の比較

これって、<でいいじゃん、なんでalgorithmヘッダにわざわざこれがあるの?

std::algorithmのmax関数

// max example
#include <iostream>     // std::cout
#include <algorithm>    // std::max
 
int main () {
  std::cout << "max(1,2)==" << max(1,2) << '\n';
  std::cout << "max(2,1)==" << max(2,1) << '\n';
  std::cout << "max('a','z')==" << max('a','z') << '\n';
  std::cout << "max(3.14,2.73)==" << max(3.14,2.73) << '\n';
  return 0;
}

出力
max(1,2)==2
max(2,1)==2
max('a','z')==z
max(3.14,2.73)==3.14

型の最大値編

C++ならば、
std::numeric_limits<T>::min()
とかを使うらしいよ。
これならテンプレート関数に対応できて便利!

#include <limits>

する必要がある。

注意!

DBL_MINとかと同じで
std::numeric_limits<T>::min()0なので
マイナスの大きな値が欲しかったら
-std::numeric_limits<T>::max()とするべき

min,maxのマクロが定義されててエラーになる

Microsoft Windowsプラットフォームのヘッダファイルwindows.hは悪名高いmin, maxマクロを定義するため、プリプロセス時に意図せずminやmaxが置換されてしまい、妙なコンパイルエラーを引き起こす場合がある。一例としてMSVC10で下記コードをコンパイルすると、それぞれエラーメッセージが出力される。

#include <windows.h>
#include <numeric>

-—- Case 1
int a = 1, b = 2;
int x = std::min(a, b);
error C2589: '(' : スコープ解決演算子 (::) の右側にあるトークンは使えません。
// error C2059: 構文エラー : '::'

-—- Case 2
double maxvalue = std::numeric_limits<double>::max();
warning C4003: マクロ 'max' に指定された実引数の数が少なすぎます。
// error C2589: '(' : スコープ解決演算子 (::) の右側にあるトークンは使えません。
// error C2059: 構文エラー : '::'

回避策1:マクロ定義を行なわせない
ヘッダファイルwindows.hのincludeより前に、マクロ NOMINMAX を定義しておく。Microsoft KBで公開されている正攻法。

#define NOMINMAX
#include <windows.h>

回避策2:マクロ定義を無効化する
ユーザが明示的にマクロのundefを行う。

#include <windows.h>
#undef min
#undef max

回避策3:プリプロセッサによるマクロ展開を抑止する(1)
minやmaxを含む式を括弧でくくり*1、関数形式マクロ(function-like macro)として扱われないようにする。

-- Case 1
int x = (std::min)(a, b); // OK
-- Case 2
double maxvalue = (std::numeric_limits<double>::max)(); // OK

回避策4:プリプロセッサによるマクロ展開を抑止する(2)
Boost.Config提供のマクロ BOOST_PREVENT_MACRO_SUBSTITUTION をminやmaxの直後に配置し、関数形式マクロとして扱われないようにする。

#include <boost/config.hpp>

-- Case 1
int x = std::min BOOST_PREVENT_MACRO_SUBSTITUTION (a, b); // OK
-- Case 2
double maxvalue = std::numeric_limits<double>::max BOOST_PREVENT_MACRO_SUBSTITUTION (); // OK
Boost Library Requirements and Guidelinesによると同マクロは、(1)min/maxを名前空間を指定せずADL経由で呼び出したいとき、または(2)クラスメンバ関数名としてmin/maxを宣言定義するときに用いる。
c++ではlimits.hをインクルードする必要がある
浮動小数点を扱うときはfloat.hをインクルードする必要がある
項目 c++ java
byte Byte.MAX_VALUE(127)
Byte.MIN_VALUE(-128)
char SCHAR_MIN(-128)1 Character.MIN_VALUE(\u0000)2
SCHAR_MAX(127) Character.MAX_VALUE(\uFFFF)
unsigned char UCHAR_MAX(255)
short型 SHRT_MAX(32767) Short.MAX_VALUE(32767)
SHRT_MIN(-32768) Short.MIN_VALUE(-32768)
unsigned short USHRT_MAX(65535) Characerと同じ
int INT_MIN(-2147483648) Integer.MIN_VALUE(-2147483648)
INT_MAX(2147483647) Integer.MAX_VALUE(2147483647)
unsigned int UINT_MAX(-1)=0xffffffff3
long LONG_MIN(-214748368) Long.MIN_VALUE(-9223372036854775808)
LONG_MAX(214748367) Long.MAX_VALUE(9223372036854775807)
unsigned long int ULONG_MAX(-1=0xffffffff)
long long int (8byte) LLONG_MIN(0)
LLONG_MAX(-214748368=0xffffffffffffffff4) 5
unsigned long long ULLONG_MAX(-1=0xfffffffffffffff6)
float FLT_MIN(2.225074e-038) Float.MIN_VALUE(1.4E-45)
FLT_MAX(3.402823e+308) Float.MAX_VALUE(3.4028235E38)
double DBL_MIN (2.225074e-308) | Double.MIN_VALUE( 4.9E-324)
DBL_MAX(1.797693e+308) Double.MAX_VALUE(1.7976931348623157E308)

数式で簡単に書く

たとえば、unsigned shortの最大値は
2**16-1

と書ける

limit type

サポートサイト Wikidot.com limittype