STL は二分探索関数 std::lower_bound と std::upper_bound を提供しますが、私はそれらのコントラクトが完全に不可解に見えるため、それらが何をするのか思い出せなかったので、それらを使用しない傾向があります。
名前を見るだけで、「lower_bound」は「最後の下限」、
つまり、指定された val (存在する場合) <= であるソートされたリストの最後の要素の略であると推測できます。
同様に、「upper_bound」は「最初の上限」、
つまりソートされたリストの最初の要素で、指定された val (存在する場合) >= の略であると思います。
しかし、ドキュメンテーションによると、彼らはそれとはかなり異なることを行っているとのことです。ドキュメントを言い換えると:
- lower_bound は >= val で
ある最初の要素を見つけます - upper_bound は > val である最初の要素を見つけます
したがって、lower_bound は下限をまったく検出しません。最初の上限を見つける!? そして upper_bound は、最初の厳密な上限を見つけます。
これって意味あるの??どのように覚えていますか?