Namespaces
Variants

std::bsearch

Von de.cppreference.net
 
 
Algorithmenbibliothek
Eingeschränkte Algorithmen und Algorithmen auf Bereichen (C++20)
Eingeschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Nicht modifizierende Sequenzoperationen    
Batch-Operationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Erzeugungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Mischoperationen (auf sortierten Bereichen)
Haufenoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
Definiert in Header <cstdlib>
void* bsearch( const void* key, const void* ptr, std::size_t count,
               std::size_t size, /* c-compare-pred */* comp );
(1)
void* bsearch( const void* key, const void* ptr, std::size_t count,
               std::size_t size, /* compare-pred */* comp );
(2)
void* bsearch( void* key, const void* ptr, std::size_t count,
               std::size_t size, /* c-compare-pred */* comp );
(3) (seit C++26)
void* bsearch( void* key, const void* ptr, std::size_t count,
               std::size_t size, /* compare-pred */* comp );
(4) (seit C++26)
extern "C" using /* c-compare-pred */ = int(const void*, const void*);
(nur zur Veranschaulichung*)
extern "C++" using /* compare-pred */ = int(const void*, const void*);
(nur zur Veranschaulichung*)

Sucht ein Element, das gleich dem Element ist, auf das key zeigt, in einem Array, auf das ptr zeigt. Das Array enthält count Elemente von jeweils size Bytes und muss in Bezug auf das Objekt, auf das key zeigt, partitioniert sein, d.h. alle Elemente, die kleiner sind als, müssen vor allen Elementen erscheinen, die gleich sind, und diese müssen vor allen Elementen erscheinen, die größer sind als das Schlüsselobjekt. Ein vollständig sortiertes Array erfüllt diese Anforderungen. Die Elemente werden mit der Funktion verglichen, auf die comp zeigt.

Wenn das Array nicht bereits in aufsteigender Reihenfolge in Bezug auf key partitioniert ist, gemäß demselben Kriterium, das comp verwendet, ist das Verhalten undefiniert.

Wenn das Array mehrere Elemente enthält, die comp als gleich dem gesuchten Element anzeigen würde, dann ist es nicht spezifiziert, welches Element die Funktion als Ergebnis zurückgibt.

Parameter

key - Zeiger auf das zu suchende Element
ptr - Zeiger auf das zu untersuchende Array
count - Anzahl der Elemente im Array
size - Größe jedes Elements im Array in Bytes
comp - Vergleichsfunktion, die einen negativen ganzzahligen Wert zurückgibt, wenn das erste Argument kleiner als das zweite ist, einen positiven ganzzahligen Wert, wenn das erste Argument größer als das zweite ist, und Null, wenn die Argumente äquivalent sind.key wird als erstes Argument übergeben, ein Element aus dem Array als zweites.

Die Signatur der Vergleichsfunktion sollte wie folgt aussehen:

int cmp(const void *a, const void *b);

Die Funktion darf die ihr übergebenen Objekte nicht verändern und muss bei Aufruf mit denselben Objekten konsistente Ergebnisse liefern, unabhängig von ihrer Position im Array.

​

Rückgabewert

Zeiger auf das gefundene Element oder Nullzeiger, wenn das Element nicht gefunden wurde.

Hinweise

Trotz des Namens verlangen weder der C- noch der POSIX-Standard, dass diese Funktion mittels binärer Suche implementiert wird, noch machen sie irgendwelche Komplexitätsgarantien.

Die beiden von der C++-Standardbibliothek bereitgestellten Überladungen unterscheiden sich, da sich die Typen des Parameters comp unterscheiden (Sprachverknüpfung ist Teil seines Typs).

Beispiel

#include <array>
#include <cstdlib>
#include <iostream>

template<typename T>
int compare(const void *a, const void *b)
{
    const auto &arg1 = *(static_cast<const T*>(a));
    const auto &arg2 = *(static_cast<const T*>(b));
    const auto cmp = arg1 <=> arg2;
    return cmp < 0 ? -1
        :  cmp > 0 ? +1
        :  0;
}

int main()
{
    std::array arr{1, 2, 3, 4, 5, 6, 7, 8};
    
    for (const int key : {4, 8, 9})
    {
        const int* p = static_cast<int*>(
            std::bsearch(&key,
                arr.data(),
                arr.size(),
                sizeof(decltype(arr)::value_type),
                compare<int>));
        
        std::cout << "value " << key;
        if (p)
            std::cout << " found at position " << (p - arr.data()) << '\n';
        else
            std::cout << " not found\n";
    }
}

Ausgabe:

value 4 found at position 3
value 8 found at position 7
value 9 not found

Siehe auch

sortiert einen Bereich von Elementen mit nicht spezifiziertem Typ
(Funktion)
findet den Bereich von Elementen, die dem gegebenen Wert entsprechen, mittels binärer Suche
(Funktionsvorlage & Algorithmus-Funktionsobjekt)
C-Dokumentation für bsearch