2012-06-27 11 views
10

おそらく私はlower boundの技術的定義を誤解していますが、a = { 0, 3, 4 }というセットがあり、その結果が0であると計算されたa.lower_bound(2)と予想されます。私。私はstd::set::lower_boundinfimumなぜstd :: set :: lower_bound(x)(実質的に)は、最大の数値<= xではなく、最小の数> = xと定義されていますか?

の数学的概念に近いことが期待されるそして、まだ標準ライブラリは、(効果的>=)xよりも小さくない最大の数として定義されます。

これにはどのような理由がありますか?

+0

をおそらくそう、イテレータの範囲の観点から考えることがより一般的ですイテレーターの戻り値は、「私は2と5の間のすべてが欲しい」と言うとき、より低い「障壁」です。しかし、なぜそれがそうでなければそれを期待するのでしょうか?あなたの背後にある/あなたの/推論とは何ですか? – PlasmaHH

+0

優れた答えに加えて、 '* iter!= x'の場合は' std :: prev(iter) 'を使って最小値を得ることができます。 –

+0

訂正 - "...標準ライブラリは**最小の**数値以上であると定義しています" @ KonradRudolphの提案は良いですが、まずは 'set'が空でないことを確認する必要があります。'std :: lower_bound'フリー関数については、' reverse_iterator'と 'std :: greater'を使って" error "の方向を逆にすることもできます。 – Potatoswatter

答えて

27

"[lower|upper]_bound"関数は、セットの順序に違反しないキーを挿入できるセット内の場所を返すためのものです。 STLセットのイテレータが次の要素の前を指しているため、がイテレータを0に返した場合、2を挿入するとセットの順序に違反しますが、今度は{2, 0, 3, 4}になります。上限は、設定された順序に違反することなく挿入できる最後の場所を表示します。

これは、セットに重複するキー入力がある場合に最も便利です。 {0, 3, 3, 4}を検討してください。 lower_bound(3)はここに反復子を返します。{0, *, 3, 3, 4}upper_bound(3){0, 3, 3, *, 4}を返します。

+0

簡単明解な答えです。 – Dan

4

lower_boundupper_boundの動作を一緒に考えてみてください。

STLでは、範囲は常にクローズオープン間隔です。 2つのイテレータで区切られた範囲は、firstlastの間のすべての要素を含み、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を呼び出す必要があることに注意してください。]

+0

'lower_bound(n)'と 'upper_bound(m)'の間を反復すると、 '[n ... m]'の範囲にあるすべての要素を訪れることになります。 –

関連する問題