C++ STL lower_bound upper_boundの使い方とcmp関数


比較関数を付けない場合:
    int a[]={0,1,2,2,3};
    printf("%d
",lower_bound(a,a+5,2,cmp)-a); printf("%d
",upper_bound(a,a+5,2,cmp)-a);

結果:2 4
lowerの意味は,与えられた順序付けされたaに対してkeyが最も早くその位置に挿入できることである.
0 1|2 2 3ですので2番に最初に挿入します
upperの意味は,与えられた順序付けされたaに対してkeyが遅くともその位置に挿入できることである.
0 1 2 2|3ですので2は遅くとも4番に挿入します
比較関数が追加されました:
bool cmp(int a,int b)
{
    return a<b;
}
int main()
{
    int a[]={0,1,2,2,3};
    printf("%d
",lower_bound(a,a+5,2,cmp)-a); printf("%d
",upper_bound(a,a+5,2,cmp)-a); return 0 ; }

結果は依然として2 4で、結論を出すことができます.
cmpの中の関数は演算の比較より小さいことを書くべきです
等号を付けると、lowerとupperの2つの関数機能はちょうど逆になります.
bool cmp(int a,int b)
{
    return a<=b;
}
int main()
{
    int a[]={0,1,2,2,3};
    printf("%d
",lower_bound(a,a+5,2,cmp)-a); printf("%d
",upper_bound(a,a+5,2,cmp)-a); return 0 ; }

結果は4 2