lower_bound と upper_bound は組み込みの二分探索関数です。
lower_bound - 対数時間で、指定された値 k 以上の、ソートされた配列内の最小の要素を見つける関数です。
配列の境界と k の値を引数として受け取ります。
見つかった要素にイテレータを返します。そのような要素が存在しない場合は配列の最後 (含まれていない) にイテレータを返します。
詳細については、ドキュメントをご覧ください。
upper_bound - ソートされた配列内で対数時間で、指定された値 k より厳密に大きい最小の要素を見つける関数です。
配列の境界と k の値を引数として受け取ります。
見つかった要素にイテレータを返します。そのような要素が存在しない場合は配列の最後 (含まれていない) にイテレータを返します。
詳細については、ドキュメントをご覧ください。
上記のランダム アクセス コレクションには反復子がないため、セットまたはマルチセットでこれらの関数を使用すると、対数時間では機能しないことを明確にする価値があります。
ただし、これらのコレクションには対応する組み込みメソッドがあります (つまり、「ドットを介して」メソッドを使用する必要があります)。
例:
ベクトル a = { 0, 1, 3, 5, 7 };
ベクトル::反復子それ;
it = lower_bound(a.begin(), a.end(), 4);
// *それ == 5
it = lower_bound(a.begin(), a.end(), 5);
// *それ == 5
it = lower_bound(a.begin(), a.end(), 8);
// それ == a.end()
it = upper_bound(a.begin(), a.end(), 4);
// *それ == 5
it = upper_bound(a.begin(), a.end(), 5);
// *それ == 7
it = upper_bound(a.begin(), a.end(), -1);
// *それ == 0
// イテレータを減算することで、見つかった要素のインデックスを取得できます
int ind = lower_bound(a.begin(), a.end(), 4) - a.begin();
// インド == 3
// セットや同様のコレクションには関数の代わりにメソッドを使用する必要があります
set s{ 1, 3, 5 };
set::iterator sit;
座る = s. lower_bound(3);
// *座る == 3
座る = s.upper_bound(3);
// *座る == 5