Namensräume
Varianten
Aktionen

std::ranges::sort_heap

Von cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
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
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Eingeschränkte Algorithmen
Alle Namen in diesem Menü gehören zum Namespace std::ranges
Nicht-modifizierende Sequenzoperationen
Modifizierende Sequenzoperationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen (auf sortierten Bereichen)
       
       
Mengenoperationen (auf sortierten Bereichen)
Heapoperationen
         
sort_heap
Minimum/Maximum-Operationen
       
       
Permutationsoperationen
Faltoperationen
Operationen auf uninitialisiertem Speicher
Rückgabetypen
 
Definiert in Header <algorithm>
Aufruf-Signatur
template< std::random_access_iterator I, std::sentinel_for<I> S,

          class Comp = ranges::less, class Proj = std::identity >
    erfordert std::sortable<I, Comp, Proj>

constexpr I sort_heap( I first, S last, Comp comp = {}, Proj proj = {} );
(1) (seit C++20)
template< ranges::random_access_range R,

          class Comp = ranges::less, class Proj = std::identity >
    erfordert std::sortable<ranges::iterator_t<R>, Comp, Proj>
constexpr ranges::borrowed_iterator_t<R>

    sort_heap( R&& r, Comp comp = {}, Proj proj = {} );
(2) (seit C++20)

Sortiert die Elemente im angegebenen Bereich in Bezug auf comp und proj, wobei der Bereich ursprünglich einen Heap in Bezug auf comp und proj darstellt. Der sortierte Bereich behält die Heap-Eigenschaft nicht mehr bei.

1) Der angegebene Bereich ist [firstlast).
2) Der angegebene Bereich ist r.

Wenn der angegebene Bereich kein Heap in Bezug auf comp und proj ist, ist das Verhalten undefiniert.

Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell als niebloids bekannt), d.h.

Inhalt

[bearbeiten] Parameter

first, last - das Iterator-Sentinel-Paar, das den zu modifizierenden Bereich definiert
r - Der Bereich der zu ändernden Elemente
comp - Comparator, der auf die projizierten Elemente angewendet werden soll
proj - Projektion, die auf die Elemente angewendet wird

[bearbeiten] Rückgabewert

1) last

[bearbeiten] Komplexität

Höchstens 2N⋅log(N) Anwendungen von comp und 4N⋅log(N) Anwendungen von proj, wobei N die ist

1) ranges::distance(first, last)

[bearbeiten] Mögliche Implementierung

struct sort_heap_fn
{
    template<std::random_access_iterator I, std::sentinel_for<I> S,
             class Comp = ranges::less, class Proj = std::identity>
        requires std::sortable<I, Comp, Proj>
    constexpr I operator()(I first, S last, Comp comp = {}, Proj proj = {}) const
    {
        auto ret{ranges::next(first, last)};
        for (; first != last; --last)
            ranges::pop_heap(first, last, comp, proj);
        return ret;
    }
 
    template<ranges::random_access_range R,
             class Comp = ranges::less, class Proj = std::identity>
        requires std::sortable<ranges::iterator_t<R>, Comp, Proj>
    constexpr ranges::borrowed_iterator_t<R>
        operator()(R&& r, Comp comp = {}, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(comp), std::move(proj));
    }
};
 
inline constexpr sort_heap_fn sort_heap{};

[bearbeiten] Beispiel

#include <algorithm>
#include <array>
#include <iostream>
 
void print(auto const& rem, const auto& v)
{
    std::cout << rem;
    for (const auto i : v)
        std::cout << i << ' ';
    std::cout << '\n';
}
 
int main()
{
    std::array v{3, 1, 4, 1, 5, 9};
    print("original array:  ", v);
 
    std::ranges::make_heap(v);
    print("after make_heap: ", v);
 
    std::ranges::sort_heap(v);
    print("after sort_heap: ", v);
}

Ausgabe

original array:  3 1 4 1 5 9
after make_heap: 9 5 4 1 1 3
after sort_heap: 1 1 3 4 5 9

[bearbeiten] Siehe auch

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