std::binary_search
| Definiert in Header <algorithm> |
||
| (1) | ||
template< class ForwardIt, class T > bool binary_search( ForwardIt first, ForwardIt last, |
(constexpr seit C++20) (bis C++26) |
|
| template< class ForwardIt, class T = typename std::iterator_traits <ForwardIt>::value_type > |
(seit C++26) | |
| (2) | ||
template< class ForwardIt, class T, class Compare > bool binary_search( ForwardIt first, ForwardIt last, |
(constexpr seit C++20) (bis C++26) |
|
| template< class ForwardIt, class T = typename std::iterator_traits <ForwardIt>::value_type, |
(seit C++26) | |
Prüft, ob ein Element, das zu value äquivalent ist, im partitionierten Bereich [first, last) vorkommt.
|
Wenn für einen Iterator iter in Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert
|
(bis C++20) |
|
Äquivalent zu std::binary_search(first, last, value, std::less{}). |
(seit C++20) |
[first, last) !bool(comp(*iter, value)) && !bool(comp(value, *iter)) true ist, wird true zurückgegeben. Andernfalls wird false zurückgegeben.- Für jedes Element elem in
[first,last)impliziert bool(comp(elem, value)) nicht !bool(comp(value, elem)). - Die Elemente elem in
[first,last)sind bezüglich der Ausdrücke bool(comp(elem, value)) und !bool(comp(value, elem)) nicht partitioniert.
Inhalt |
[edit] Parameter
| first, last | - | das Iterator-Paar, das den partitionierten Bereich der zu untersuchenden Elemente definiert |
| value | - | Wert, mit dem die Elemente verglichen werden sollen |
| comp | - | Binäres Prädikat, das **wahr** zurückgibt, wenn das erste Argument vor dem zweiten geordnet ist. Die Signatur der Prädikatfunktion sollte äquivalent zur folgenden sein: bool pred(const Type1 &a, const Type2 &b); Obwohl die Signatur nicht zwingend const & haben muss, darf die Funktion die ihr übergebenen Objekte nicht modifizieren und muss alle Werte vom Typ (möglicherweise const) |
| Typanforderungen | ||
-ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen. | ||
-Compare muss die Anforderungen an ein Binäres Prädikat erfüllen. Es muss nicht Compare erfüllen. | ||
[edit] Rückgabewert
true, wenn ein zu value äquivalentes Element gefunden wird, andernfalls false.
[edit] Komplexität
Gegeben sei N als std::distance(first, last).
Wenn jedoch ForwardIt kein LegacyRandomAccessIterator ist, ist die Anzahl der Iterator-Inkremente linear in N.
[edit] Hinweise
Obwohl std::binary_search nur verlangt, dass [first, last) partitioniert ist, wird dieser Algorithmus üblicherweise dann verwendet, wenn [first, last) sortiert ist, so dass die binäre Suche für jedes value gültig ist.
std::binary_search prüft nur, ob ein äquivalentes Element existiert. Um einen Iterator zu diesem Element (falls vorhanden) zu erhalten, sollte stattdessen std::lower_bound verwendet werden.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403 |
(C++26) | Listeninitialisierung für Algorithmen (1,2) |
[edit] Mögliche Implementierung
Siehe auch die Implementierungen in libstdc++ und libc++.
| binary_search (1) |
|---|
template<class ForwardIt, class T = typename std::iterator_traits<ForwardIt>::value_type> bool binary_search(ForwardIt first, ForwardIt last, const T& value) { return std::binary_search(first, last, value, std::less{}); } |
| binary_search (2) |
template<class ForwardIt, class T = typename std::iterator_traits<ForwardIt>::value_type, class Compare> bool binary_search(ForwardIt first, ForwardIt last, const T& value, Compare comp) { first = std::lower_bound(first, last, value, comp); return (!(first == last) and !(comp(value, *first))); } |
[edit] Beispiel
#include <algorithm> #include <cassert> #include <complex> #include <iostream> #include <vector> int main() { const auto haystack = {1, 3, 4, 5, 9}; for (const auto needle : {1, 2, 3}) { std::cout << "Searching for " << needle << '\n'; if (std::binary_search(haystack.begin(), haystack.end(), needle)) std::cout << "Found " << needle << '\n'; else std::cout << "Not found!\n"; } using CD = std::complex<double>; std::vector<CD> nums{{1, 1}, {2, 3}, {4, 2}, {4, 3}}; auto cmpz = [](CD x, CD y){ return abs(x) < abs(y); }; #ifdef __cpp_lib_algorithm_default_value_type assert(std::binary_search(nums.cbegin(), nums.cend(), {4, 2}, cmpz)); #else assert(std::binary_search(nums.cbegin(), nums.cend(), CD{4, 2}, cmpz)); #endif }
Ausgabe
Searching for 1 Found 1 Searching for 2 Not found! Searching for 3 Found 3
[edit] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 270 | C++98 | Compare musste Compare erfüllen und T mussteLessThanComparable sein (starke schwache Ordnung erforderlich) |
nur eine Partitionierung ist erforderlich; heterogene Vergleiche zulässig |
| LWG 787 | C++98 | Es waren maximal log2(N)+2 Vergleiche erlaubt | korrigiert auf log2(N)+O(1) |
[edit] Siehe auch
| gibt den Bereich von Elementen zurück, die einem bestimmten Schlüssel entsprechen (Funktionstemplate) | |
| Gibt einen Iterator zum ersten Element zurück, das nicht kleiner als der gegebene Wert ist (Funktionstemplate) | |
| Gibt einen Iterator zum ersten Element zurück, das *größer* als ein bestimmter Wert ist (Funktionstemplate) | |
| (C++20) |
Stellt fest, ob ein Element in einem teilweise geordneten Bereich vorhanden ist (Algorithmus-Funktionsobjekt) |