11

の技術的な定義を誤解しているのかもしれませんlower boundが、セットを持っていてa = { 0, 3, 4 }を計算するa.lower_bound(2)と結果は になると思います0つまり、私はinfimumstd::set::lower_boundの数学的概念に近いと期待しています

それでも、標準ライブラリはそれを (事実上>=) x より小さくない最大の数として定義します。

この背後にある理由は何ですか?

4

2 に答える 2

28

" [lower|upper]_bound" 関数は、セットの順序に違反しないキーを挿入できるセット内の場所を返すことを目的としています。STL セットの反復子は次の要素の前を指しているため、反復子を にlower_bound(2)返すと0、挿入2するとセットの順序に違反し、現在は になります{2, 0, 3, 4}。上限は、セット順序に違反することなく挿入できる最後の場所を示すのに役立ちます。

これは、セットに重複するキー エントリがある可能性がある場合に最も役立ちます。を考慮してください{0, 3, 3, 4}lower_bound(3)here: へのイテレータを返しますが、here:{0, *, 3, 3, 4}upper_bound(3)返します{0, 3, 3, *, 4}

于 2012-06-27T15:49:47.297 に答える
5

lower_boundと の動作をupper_bound一緒に検討すると役立つ場合があります。

STL では、範囲は常に閉 - 開間隔です。first2 つの反復子とで区切られた範囲には、とlastの間のすべての要素( を含む)と を除く要素が含まれます。間隔表記を使用して、これを として表します。firstlastfirstlast[first, last)

lower_bound指定された値と等しい要素の範囲upper_boundを見つけるように定義されています。との間を反復すると、 と等しいすべての要素を反復します。に等しい要素がない場合、が保証されます。lower_bound(x)upper_bound(x)xxlower_bound(x) == upper_bound(x)

この機能は、すべてのキーに対して最大で 1 つの要素を持つ ではそれほど重要ではありませんが、一意でない連想コンテナーや、並べ替えられた要素の任意のシーケンスで使用できるstd::map非メンバーにとって非常に便利な機能です。std::lower_bound

[下限と上限の両方を取得したい場合はequal_range、両方を返す代わりに呼び出す必要があることに注意してください。]

于 2012-06-27T16:44:00.793 に答える