Namespaces
Variants

std::is_heap

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    
Stapeloperationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

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

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


 
Definiert im Header <algorithm>
template< class RandomIt >
bool is_heap( RandomIt first, RandomIt last );
(1) (seit C++11)
(constexpr seit C++20)
template< class ExecutionPolicy, class RandomIt >
bool is_heap( ExecutionPolicy&& policy,
              RandomIt first, RandomIt last );
(2) (seit C++17)
template< class RandomIt, class Compare >
bool is_heap( RandomIt first, RandomIt last, Compare comp );
(3) (seit C++11)
(constexpr seit C++20)
template< class ExecutionPolicy, class RandomIt, class Compare >
bool is_heap( ExecutionPolicy&& policy,
              RandomIt first, RandomIt last, Compare comp );
(4) (seit C++17)

Überprüft, ob [first, last) ein Heap ist.

1) Die zu überprüfende Heap-Eigenschaft bezieht sich auf operator<(bis C++20)std::less{}(seit C++20).
3) Die zu überprüfende Heap-Eigenschaft bezieht sich auf comp.
2,4) Gleich wie (1,3), aber ausgeführt gemäß policy.
Diese Überladungen nehmen nur dann an der Überladungsauflösung teil, wenn der Wert des folgenden Ausdrucks true ist:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(bis C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(seit C++20)

Parameter

first, last - das Paar von Iteratoren, das den Bereich der zu überprüfenden Elemente definiert
policy - die zu verwendende Ausführungsstrategie
comp - Vergleichsfunktionsobjekt (d. h. ein Objekt, das die Anforderungen von Compare erfüllt), das true zurückgibt, wenn das erste Argument kleiner als das zweite ist.

Die Signatur der Vergleichsfunktion sollte der folgenden entsprechen:

bool cmp(const Type1& a, const Type2& b);

Obwohl die Signatur nicht const& enthalten muss, darf die Funktion die übergebenen Objekte nicht verändern und muss in der Lage sein, alle Werte des Typs (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie zu akzeptieren (daher ist Type1& nicht erlaubt, ebenso ist Type1 nicht erlaubt, es sei denn, für Type1 ist eine Verschiebung gleichbedeutend mit einer Kopie(seit C++11)).
Die Typen Type1 und Type2 müssen so sein, dass ein Objekt vom Typ RandomIt dereferenziert und dann implizit in beide konvertiert werden kann.

Typanforderungen
-
RandomIt muss die Anforderungen von LegacyRandomAccessIterator erfüllen.
-
Compare muss die Anforderungen von Compare erfüllen.

Rückgabewert

true genau dann, wenn der Bereich bezüglich des entsprechenden Komparators ein Heap ist, false andernfalls.

Komplexität

Gegeben N als std::distance(first, last):

1,2) O(N) Vergleiche mit operator<(bis C++20)std::less{}(seit C++20).
3,4) O(N) Anwendungen der Vergleichsfunktion comp.

Ausnahmen

Die Überladungen mit einem Vorlagenparameter namens ExecutionPolicy melden Fehler wie folgt:

  • Wenn die Ausführung einer im Rahmen des Algorithmus aufgerufenen Funktion eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher zuweisen kann, wird std::bad_alloc ausgelöst.

Beispiel

#include <algorithm>
#include <bit>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9};
    
    std::cout << "initially, v:\n";
    for (const auto& i : v)
        std::cout << i << ' ';
    std::cout << '\n';
    
    if (!std::is_heap(v.begin(), v.end()))
    {
        std::cout << "making heap...\n";
        std::make_heap(v.begin(), v.end());
    }
    
    std::cout << "after make_heap, v:\n";
    for (auto t{1U}; const auto& i : v)
        std::cout << i << (std::has_single_bit(++t) ? " | " : " ");
    std::cout << '\n';
}

Ausgabe:

initially, v:
3 1 4 1 5 9 2 6 5 3 5 8 9 7 9
making heap...
after make_heap, v:
9 | 6 9 | 5 5 9 7 | 1 1 3 5 8 3 4 2 |

Siehe auch

findet den größten Teilbereich, der ein Max-Heap ist
(Funktionsvorlage & Algorithmusfunktionsobjekt)
erzeugt einen Max-Heap aus einem Bereich von Elementen
(Funktionsvorlage & Algorithmusfunktionsobjekt)
fügt ein Element zu einem Max-Heap hinzu
(Funktionsvorlage & Algorithmusfunktionsobjekt)
entfernt das größte Element aus einem Max-Heap
(Funktionsvorlage & Algorithmusfunktionsobjekt)
wandelt einen Max-Heap in einen Bereich von aufsteigend sortierten Elementen um
(Funktionsvorlage & Algorithmusfunktionsobjekt)
prüft, ob der angegebene Bereich ein Max-Heap ist
(Algorithmusfunktionsobjekt)