今回は、○○以上の要素、○○より大きい要素の位置を返すlower_boundとupper_boundについて。
より厳密に説明すると、
lower_bound(x,y,p)は、整列済みコンテナ[x, y)の中から、与えられた値p以上となる要素の位置を返します。
upper_bound(x,y,p)は、整列済みコンテナ[x,y)の中から、与えられた値pより大きくなる要素の位置を返します。
百聞は一見に如かずということで、サンプルソース。
- #define SIZE(buff) (sizeof(buff)/sizeof(buff[0]))
- int main() {
- int x[] = {0,1,1,2,2,2,4,5,5,10};
- int p1 = (lower_bound(x, x+SIZE(x), 4) - x);
- int p2 = (upper_bound(x, x+SIZE(x), 4) - x);
- printf("x[%d] =%d >= %d\n", p1, x[p1], 4);
- printf("x[%d] =%d > %d\n", p2, x[p2], 4);
- return 0;
- }
x[6] (=4) >= 4
x[7] (=5) > 4
さらに、逆順にソートされたコンテナから、○○以下になる要素の位置、○○より小さくなる要素の位置を取り出したいという場合もあるかと思います。そういう場合は、予めコンテナを取得または定義する段階で、マイナスを付けておくといいです。
- int main() {
- // The original sequence is: {10,8,8,7,5,5,5,3,1}
- int x[] = {-10,-8,-8,-7,-5,-5,-5,-3,-1};
- int p1 = lower_bound(x, x+SIZE(x), -5) - x;
- int p2 = upper_bound(x, x+SIZE(x), -5) - x;
- printf("x[%d] (=%d) <= %d\n", p1, -x[p1], 5);
- printf("x[%d] (=%d) < %d\n", p2, -x[p2], 5);
- return 0;
- }
0 件のコメント:
コメントを投稿