Scott Meyersによる効果的なSTL(195ページ)には、次の行があります。
「lower_boundの結果は、探している値を指しているかどうかを確認するためにテストする必要があります。findとは異なり、終了イテレータに対してlower_boundの戻り値をテストすることはできません。」
なぜあなたがこれを行うことができないのか誰かが説明できますか?私にとってはうまくいくようです。
Scott Meyersによる効果的なSTL(195ページ)には、次の行があります。
「lower_boundの結果は、探している値を指しているかどうかを確認するためにテストする必要があります。findとは異なり、終了イテレータに対してlower_boundの戻り値をテストすることはできません。」
なぜあなたがこれを行うことができないのか誰かが説明できますか?私にとってはうまくいくようです。
あなたの要素が存在するので、それはあなたのためにうまく働きます。
lower_bound
指定された値以上の最初の要素にイテレータを返し、指定された値より大きいupper_bound
最初の要素にイテレータを返します。
1, 2, 3, 3, 4, 6, 7
配列が与えられると、lower_bound(..., 5)
6を指すイテレータを返します。
したがって、値が存在するかどうかを確認する2つの方法:
(個別に計算し、おそらく最適ではない)をequal_range
取得するためにも使用します。境界間の値が0より大きい場合、要素は存在します 。upper_bound
lower_bound
upper_bound
std::distance
1, 2, 3, 3, 4, 6, 7
std::distance(std::lower_bound(v.begin(),v.end(),5), std::upper_bound(v.begin(),v.end(),5)) == 0 // 6 is absent
std::distance(std::lower_bound(v.begin(),v.end(),3), std::upper_bound(v.begin(),v.end(),3)) == 2 // 3 is present
イテレータが指す要素を値(提供された演算子!=
で<
一貫性のあるもの)と比較しますが、終了イテレータを返さないことを確認する必要があります。
*(std::lower_bound(v.begin(), v.end(), 5)) != 5
さらに、lower_bound
は二分探索アルゴリズムであるためend
、要素が見つからなかった場合に返すのは一貫性がありません。実際、このアルゴリズムによって返されるイテレータは、たとえば、後続の挿入操作のヒントとして使用できます。