サポートされているものについてより正式なステートメントが必要な場合は、標準で次のように記述されています。std::lower_bound
私たちができる最善の検索については、 (§25.4.3.1/ 3)のような二分探索を使用することです。
複雑さ:最大でlog 2(last − first
)+ O(1)の比較。
ただし、これは比較の数を示しているだけです。コンテナ内を移動するには、lower_bound
を使用しstd::advance
ます。私たちが見つけたstd::listについて(§23.3.5.1/ 1):
リストは、双方向イテレータをサポートするシーケンスコンテナです[...]
std::advance
では、双方向イテレータを提供するコレクションではどのように機能するのでしょうか。(§24.4.4/ 1):
[...]入力、順方向、および双方向のイテレータの場合、++を使用して線形時間の実装を提供します。
したがって、リスト内の何かを(値または位置のいずれかで)見つけるために、対数の比較数を使用して、全体的に線形の複雑さを調べます。正直なところ、std::find
(§25.2.5/ 2)の方がおそらく良いでしょう:
複雑さ:last - first
対応する述語のほとんどのアプリケーション。
ただし、2つのどちらを選択するかは、必ずしも完全に明白であるとは限りません。リストのトラバースは明らかに直線的です。std::find
トラバーサルをstd::lower_bound
最小限に抑え、比較を最小限に抑えます。比較がトラバーサルよりもはるかに高価な場合は、std::lower_bound
おそらくより良い結果が得られます。比較がかなり安い場合std::find
は、おそらくより良いでしょう。