std::ranges::partial_sort
Von cppreference.com
| 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 > |
(1) | (seit C++20) |
| template< ranges::random_access_range R, class Comp = ranges::less, class Proj = std::identity > |
(2) | (seit C++20) |
1) Ordnet Elemente so, dass der Bereich
[first, middle) die sortierten middle - first kleinsten Elemente im Bereich [first, last) enthält. Die Reihenfolge von gleichen Elementen ist nicht garantiert erhalten zu bleiben. Die Reihenfolge der verbleibenden Elemente im Bereich
[middle, last) ist nicht spezifiziert. Die Elemente werden unter Verwendung der gegebenen binären Vergleichsfunktion comp verglichen und unter Verwendung des Funktions-Objekts proj projiziert.
2) Dasselbe wie (1), verwendet aber r als Bereich, als ob ranges::begin(r) als first und ranges::end(r) als last verwendet würden.
Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell als niebloids bekannt), d.h.
- Können explizite Template-Argumentlisten bei keinem von ihnen angegeben werden.
- Keiner von ihnen ist für Argument-abhängige Suche sichtbar.
- Wenn einer von ihnen durch normale unqualifizierte Suche als Name links vom Funktionsaufrufoperator gefunden wird, wird die Argument-abhängige Suche unterdrückt.
Inhalt |
[edit] Parameter
| first, last | - | das Iterator-Sentinel-Paar, das den Bereich der neu anzuordnenden Elemente definiert |
| r | - | der neu anzuordnende Bereich von Elementen |
| middle | - | der Bereich [first, middle) wird sortiert |
| comp | - | Comparator, der auf die projizierten Elemente angewendet werden soll |
| proj | - | Projektion, die auf die Elemente angewendet wird |
[edit] Rückgabewert
Ein Iterator, der gleich last ist.
[edit] Komplexität
𝓞(N·log(M)) Vergleiche und doppelt so viele Projektionen, wobei N ranges::distance(first, last) ist und M ranges::distance(first, middle).
[edit] Mögliche Implementierung
struct partial_sort_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, I middle, S last, Comp comp = {}, Proj proj = {}) const { if (first == middle) return ranges::next(first, last); ranges::make_heap(first, middle, comp, proj); auto it {middle}; for (; it != last; ++it) { if (std::invoke(comp, std::invoke(proj, *it), std::invoke(proj, *first))) { ranges::pop_heap(first, middle, comp, proj); ranges::iter_swap(middle - 1, it); ranges::push_heap(first, middle, comp, proj); } } ranges::sort_heap(first, middle, comp, proj); return it; } 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, ranges::iterator_t<R> middle, Comp comp = {}, Proj proj = {}) const { return (*this)(ranges::begin(r), std::move(middle), ranges::end(r), std::move(comp), std::move(proj)); } }; inline constexpr partial_sort_fn partial_sort {}; |
[edit] Beispiel
Führen Sie diesen Code aus
#include <algorithm> #include <functional> #include <iostream> #include <string> #include <vector> void print(const auto& v) { for (const char e : v) std::cout << e << ' '; std::cout << '\n'; } void underscore(int n) { while (n-- > 0) std::cout << "^ "; std::cout << '\n'; } int main() { static_assert('A' < 'a'); std::vector<char> v {'x', 'P', 'y', 'C', 'z', 'w', 'P', 'o'}; print(v); const int m {3}; std::ranges::partial_sort(v, v.begin() + m); print(v), underscore(m); static_assert('1' < 'a'); std::string s {"3a1b41c5"}; print(s); std::ranges::partial_sort(s.begin(), s.begin() + m, s.end(), std::greater {}); print(s), underscore(m); }
Ausgabe
x P y C z w P o C P P y z x w o ^ ^ ^ 3 a 1 b 4 1 c 5 c b a 1 3 1 4 5 ^ ^ ^
[edit] Siehe auch
| (C++20) |
Kopiert und sortiert einen Bereich von Elementen teilweise (Algorithmus-Funktionsobjekt) |
| (C++20) |
Sortiert einen Bereich aufsteigend (Algorithmus-Funktionsobjekt) |
| (C++20) |
Sortiert einen Bereich von Elementen und behält dabei die Reihenfolge zwischen gleichen Elementen bei (Algorithmus-Funktionsobjekt) |
| (C++20) |
Sortiert den gegebenen Bereich teilweise, so dass er durch das gegebene Element partitioniert wird (Algorithmus-Funktionsobjekt) |
| (C++20) |
Erstellt aus einem Bereich von Elementen einen Max-Heap (Algorithmus-Funktionsobjekt) |
| (C++20) |
Entfernt das größte Element aus einem Max-Heap (Algorithmus-Funktionsobjekt) |
| (C++20) |
Fügt ein Element zu einem Max-Heap hinzu (Algorithmus-Funktionsobjekt) |
| (C++20) |
Verwandelt einen Max-Heap in einen aufsteigend sortierten Bereich von Elementen (Algorithmus-Funktionsobjekt) |
| Sortiert die ersten N Elemente eines Bereichs (Funktionstemplate) |