の技術的な定義を誤解しているのかもしれませんlower bound
が、セットを持っていてa = { 0, 3, 4 }
を計算するa.lower_bound(2)
と結果は になると思います0
。つまり、私はinfimumstd::set::lower_bound
の数学的概念に近いと期待しています
それでも、標準ライブラリはそれを (事実上>=
) x より小さくない最大の数として定義します。
この背後にある理由は何ですか?
の技術的な定義を誤解しているのかもしれませんlower bound
が、セットを持っていてa = { 0, 3, 4 }
を計算するa.lower_bound(2)
と結果は になると思います0
。つまり、私はinfimumstd::set::lower_bound
の数学的概念に近いと期待しています
それでも、標準ライブラリはそれを (事実上>=
) x より小さくない最大の数として定義します。
この背後にある理由は何ですか?
" [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}
。
lower_bound
と の動作をupper_bound
一緒に検討すると役立つ場合があります。
STL では、範囲は常に閉 - 開間隔です。first
2 つの反復子とで区切られた範囲には、とlast
の間のすべての要素( を含む)と を除く要素が含まれます。間隔表記を使用して、これを として表します。first
last
first
last
[first, last)
lower_bound
指定された値と等しい要素の範囲upper_bound
を見つけるように定義されています。との間を反復すると、 と等しいすべての要素を反復します。に等しい要素がない場合、が保証されます。lower_bound(x)
upper_bound(x)
x
x
lower_bound(x) == upper_bound(x)
この機能は、すべてのキーに対して最大で 1 つの要素を持つ ではそれほど重要ではありませんが、一意でない連想コンテナーや、並べ替えられた要素の任意のシーケンスで使用できるstd::map
非メンバーにとって非常に便利な機能です。std::lower_bound
[下限と上限の両方を取得したい場合はequal_range
、両方を返す代わりに呼び出す必要があることに注意してください。]