Namensräume
Varianten
Aktionen

std::binary_search

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
binary_search
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Definiert in Header <algorithm>
(1)
template< class ForwardIt, class T >

bool binary_search( ForwardIt first, ForwardIt last,

                    const T& value );
(constexpr seit C++20)
(bis C++26)
template< class ForwardIt, class T = typename std::iterator_traits

                                         <ForwardIt>::value_type >
constexpr bool binary_search( ForwardIt first, ForwardIt last,

                              const T& value );
(seit C++26)
(2)
template< class ForwardIt, class T, class Compare >

bool binary_search( ForwardIt first, ForwardIt last,

                    const T& value, Compare comp );
(constexpr seit C++20)
(bis C++26)
template< class ForwardIt, class T = typename std::iterator_traits

                                         <ForwardIt>::value_type,
          class Compare >
constexpr bool binary_search( ForwardIt first, ForwardIt last,

                              const T& value, Compare comp );
(seit C++26)

Prüft, ob ein Element, das zu value äquivalent ist, im partitionierten Bereich [firstlast) vorkommt.

1) Die Äquivalenz wird mit operator< überprüft.

Wenn für einen Iterator iter in [firstlast) !bool(*iter < value) && !bool(value < *iter) true ist, wird true zurückgegeben. Andernfalls wird false zurückgegeben.

Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert

  • Für jedes Element elem in [firstlast) impliziert bool(elem < value) nicht !bool(value < elem).
  • Die Elemente elem in [firstlast) sind bezüglich der Ausdrücke bool(elem < value) und !bool(value < elem) nicht partitioniert.
(bis C++20)

Äquivalent zu std::binary_search(first, last, value, std::less{}).

(seit C++20)
2) Die Äquivalenz wird mit comp überprüft.
Wenn für einen Iterator iter in [firstlast) !bool(comp(*iter, value)) && !bool(comp(value, *iter)) true ist, wird true zurückgegeben. Andernfalls wird false zurückgegeben.
Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert
  • Für jedes Element elem in [firstlast) impliziert bool(comp(elem, value)) nicht !bool(comp(value, elem)).
  • Die Elemente elem in [firstlast) 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) Type1 und Type2 unabhängig von der Wertkategorie akzeptieren können (daher ist Type1 & nicht erlaubt, ebenso wenig wie Type1, es sei denn, für Type1 ist eine Verschiebung gleichbedeutend mit einer Kopie(seit C++11)).
Die Typen Type1 und Type2 müssen so beschaffen sein, dass ein Objekt vom Typ T implizit in beide Typen Type1 und Type2 konvertiert werden kann, und ein Objekt vom Typ ForwardIt dereferenziert und dann implizit in beide Typen Type1 und Type2 konvertiert werden kann. ​

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).

1) Höchstens log2(N)+O(1) Vergleiche mit value unter Verwendung von operator<
2) Höchstens log2(N)+O(1) Anwendungen des Vergleichers comp.

Wenn jedoch ForwardIt kein LegacyRandomAccessIterator ist, ist die Anzahl der Iterator-Inkremente linear in N.

[edit] Hinweise

Obwohl std::binary_search nur verlangt, dass [firstlast) partitioniert ist, wird dieser Algorithmus üblicherweise dann verwendet, wenn [firstlast) 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 musste
LessThanComparable 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) [edit]
Gibt einen Iterator zum ersten Element zurück, das nicht kleiner als der gegebene Wert ist
(Funktionstemplate) [edit]
Gibt einen Iterator zum ersten Element zurück, das *größer* als ein bestimmter Wert ist
(Funktionstemplate) [edit]
Stellt fest, ob ein Element in einem teilweise geordneten Bereich vorhanden ist
(Algorithmus-Funktionsobjekt)[edit]