Namensräume
Varianten
Aktionen

std::is_heap_until

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)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
(C++11)
is_heap_until
(C++11)
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Definiert in Header <algorithm>
template< class RandomIt >
RandomIt ist_heap_until( RandomIt first, RandomIt last );
(1) (seit C++11)
(constexpr seit C++20)
template< class ExecutionPolicy, class RandomIt >

RandomIt ist_heap_until( ExecutionPolicy&& policy,

                        RandomIt first, RandomIt last );
(2) (seit C++17)
template< class RandomIt, class Compare >
RandomIt ist_heap_until( RandomIt first, RandomIt last, Compare comp );
(3) (seit C++11)
(constexpr seit C++20)
template< class ExecutionPolicy, class RandomIt, class Compare >

RandomIt ist_heap_until( ExecutionPolicy&& policy,

                        RandomIt first, RandomIt last, Compare comp );
(4) (seit C++17)

Untersucht den Bereich [firstlast) und findet den größten Bereich, der bei first beginnt und ein Heap ist.

1) Die zu prüfende Heap-Eigenschaft bezieht sich auf operator<(bis C++20)std::less{}(seit C++20).
3) Die zu prüfende Heap-Eigenschaft bezieht sich auf comp.
2,4) Dasselbe wie (1,3), aber ausgeführt gemäß policy.
Diese Überladungen nehmen an der Auflösungsauflösung teil, nur wenn alle folgenden Bedingungen erfüllt sind

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> ist true.

(bis C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> ist true.

(seit C++20)

Inhalt

[bearbeiten] Parameter

first, last - das Iteratorenpaar, das den Bereich der zu untersuchenden Elemente definiert
policy - die Ausführungsrichtlinie, die verwendet werden soll
comp - Ein Vergleichsfunktions-Objekt (d.h. ein Objekt, das die Anforderungen an Compare erfüllt), das true zurückgibt, wenn das erste Argument *weniger* als das zweite ist.

Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein

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

Obwohl die Signatur nicht const& haben muss, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte vom Typ (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie akzeptieren (daher ist Type1& nicht erlaubt, und auch nicht Type1, es sei denn, für Type1 ist ein Move äquivalent zu einer Kopie(seit C++11)).
Die Typen Type1 und Type2 müssen so beschaffen sein, dass ein Objekt vom Typ RandomIt dereferenziert und dann implizit in beide konvertiert werden kann.

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

[bearbeiten] Rückgabewert

Der letzte Iterator it, für den der Bereich [firstit) ein Heap ist.

[bearbeiten] Komplexität

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

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

[bearbeiten] Ausnahmen

Die Überladungen mit einem Template-Parameter namens ExecutionPolicy berichten Fehler wie folgt

  • Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsabhängig.
  • Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.

[bearbeiten] Beispiel

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v{3, 1, 4, 1, 5, 9};
 
    std::make_heap(v.begin(), v.end());
 
    // probably mess up the heap
    v.push_back(2);
    v.push_back(6);
 
    auto heap_end = std::is_heap_until(v.begin(), v.end());
 
    std::cout << "all of v:  ";
    for (const auto& i : v)
        std::cout << i << ' ';
    std::cout << '\n';
 
    std::cout << "only heap: ";
    for (auto i = v.begin(); i != heap_end; ++i)
        std::cout << *i << ' ';
    std::cout << '\n';
}

Ausgabe

all of v:  9 5 4 1 1 3 2 6
only heap: 9 5 4 1 1 3 2

[bearbeiten] Siehe auch

(C++11)
Prüft, ob der gegebene Bereich ein Max-Heap ist
(Funktionstemplate) [edit]
Erstellt aus einem Bereich von Elementen einen Max-Heap
(Funktionstemplate) [edit]
Fügt ein Element zu einem Max-Heap hinzu
(Funktionstemplate) [edit]
Entfernt das größte Element aus einem Max-Heap
(Funktionstemplate) [edit]
Verwandelt einen Max-Heap in einen aufsteigend sortierten Bereich von Elementen
(Funktionstemplate) [edit]
Findet den größten Teilbereich, der ein Max-Heap ist
(Algorithmus-Funktionsobjekt)[edit]