8

Scott Meyersによる効果的なSTL(195ページ)には、次の行があります。

「lower_boundの結果は、探している値を指しているかどうかを確認するためにテストする必要があります。findとは異なり、終了イテレータに対してlower_boundの戻り値をテストすることはできません。」

なぜあなたがこれを行うことができないのか誰かが説明できますか?私にとってはうまくいくようです。

4

1 に答える 1

9

あなたの要素が存在するので、それはあなたのためにうまく働きます。

lower_bound指定された値以上の最初の要素にイテレータを返し、指定された値より大きいupper_bound最初の要素にイテレータを返します。

1, 2, 3, 3, 4, 6, 7配列が与えられると、lower_bound(..., 5)6を指すイテレータを返します。

したがって、値が存在するかどうかを確認する2つの方法:

  • (個別に計算し、おそらく最適ではない)をequal_range取得するためにも使用します。境界間の値が0より大きい場合、要素は存在します 。upper_boundlower_boundupper_boundstd::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、要素が見つからなかった場合に返すのは一貫性がありません。実際、このアルゴリズムによって返されるイテレータは、たとえば、後続の挿入操作のヒントとして使用できます。

于 2012-01-05T10:42:11.443 に答える