Teste den Rückgabewert von lower_bound gegen den Enditerator

8

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.

    
dangerousdave 05.01.2012, 10:38
quelle

1 Antwort

9

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.

    %Vor%
  • 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.

    %Vor%

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.

    
Benoit 05.01.2012, 10:42
quelle

Tags und Links