In einer effektiven STL von Scott Meyers (Seite 195) gibt es die folgende Zeile:
"Das Ergebnis von lower_bound muss getestet werden, um zu sehen, ob es auf den gesuchten Wert zeigt. Im Gegensatz zu find können Sie den Rückgabewert von lower_bound nicht einfach gegen den Enditerator testen."
Kann jemand erklären, warum Sie das nicht tun können? scheint gut für mich zu funktionieren.
Es funktioniert gut für Sie, weil Ihr Element vorhanden ist.
lower_bound
liefert einen Iterator an das erste Element nicht weniger als der angegebene Wert, und upper_bound
gibt einen Iterator an das erste Element zurück größer als der angegebene Wert .
Gegeben sei das Array 1, 2, 3, 3, 4, 6, 7
, lower_bound(..., 5)
gibt einen Iterator zurück, der auf 6 zeigt.
Daher gibt es zwei Möglichkeiten zu überprüfen, ob der Wert vorhanden ist:
Verwenden Sie equal_range
, um auch upper_bound
zu erhalten (das separate Berechnen von lower_bound
und upper_bound
wird wahrscheinlich suboptimal sein). Wenn das std::distance
zwischen den Grenzen größer als 0 ist, ist das Element vorhanden.
Vergleichen Sie das Element, auf das der Iterator zeigt, mit Ihrem Wert (sofern die Operatoren !=
und <
kohärent sind), aber Sie müssen sicherstellen, dass der Enditerator nicht zurückgegeben wird.
Da lower_bound
außerdem ein binärer Suchalgorithmus ist, wäre es inkonsistent, end
zurückzugeben, wenn das Element nicht gefunden wurde. Tatsächlich können die von diesem Algorithmus zurückgegebenen Iteratoren beispielsweise als Hinweis für eine nachfolgende Einfügeoperation verwendet werden.
Tags und Links c++ stl map iterator lower-bound