std:: partial_sort_copy
|
Definiert im Header
<algorithm>
|
||
|
template
<
class
InputIt,
class
RandomIt
>
RandomIt partial_sort_copy
(
InputIt first, InputIt last,
|
(1) | (constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
RandomIt
>
|
(2) | (seit C++17) |
|
template
<
class
InputIt,
class
RandomIt,
class
Compare
>
RandomIt partial_sort_copy
(
InputIt first, InputIt last,
|
(3) | (constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
RandomIt,
class
Compare
>
|
(4) | (seit C++17) |
Sortiert einige der Elemente im Bereich
[
first
,
last
)
in aufsteigender Reihenfolge und speichert das Ergebnis im Bereich
[
d_first
,
d_last
)
.
Höchstens
d_last
-
d_first
Elemente werden sortiert in den Bereich
[
d_first
,
d_first
+
n
)
platziert.
n
ist die Anzahl der zu sortierenden Elemente (
std::
min
(
std::
distance
(
first, last
)
, d_last
-
d_first
)
). Die Reihenfolge gleicher Elemente wird nicht garantiert beibehalten.
|
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) |
Wenn * first nicht in schreibbar zu d_first ist, ist das Programm fehlerhaft.
Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:
|
(bis C++11) |
|
(seit C++11) |
Inhaltsverzeichnis |
Parameter
| first, last | - | das Paar von Iteratoren, das den Bereich der zu sortierenden Elemente definiert |
| d_first, d_last | - | das Paar von Iteratoren, das den Bereich der Elemente definiert, denen die sortierten Daten zugewiesen werden |
| policy | - | die zu verwendende Ausführungsrichtlinie |
| comp | - |
Vergleichsfunktionsobjekt (d.h. ein Objekt, das die Anforderungen von
Compare
erfüllt), das
true
zurückgibt, wenn das erste Argument
kleiner
als (d.h. vor dem zweiten angeordnet ist) 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
&
benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte des Typs (möglicherweise const)
|
| Typanforderungen | ||
-
InputIt
muss die Anforderungen von
LegacyInputIterator
erfüllen.
|
||
-
ForwardIt
muss die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||
-
RandomIt
muss die Anforderungen von
LegacyRandomAccessIterator
erfüllen.
|
||
-
Compare
muss die Anforderungen von
Compare
erfüllen.
|
||
Rückgabewert
Ein Iterator auf das Element, das die obere Grenze des sortierten Bereichs definiert, d.h. d_first + std:: min ( std:: distance ( first, last ) , d_last - d_first ) .
Komplexität
Gegeben N als std:: distance ( first, last ) , D als d_last - d_first :
Ausnahmen
Die Überladungen mit einem Template-Parameter namens
ExecutionPolicy
melden Fehler wie folgt:
-
Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und
ExecutionPolicyeiner der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsdefiniert. - Wenn der Algorithmus keinen Speicher allozieren kann, wird std::bad_alloc geworfen.
Mögliche Implementierung
Siehe auch die Implementierungen in libstdc++ und libc++ .
Beispiel
Der folgende Code sortiert einen Vektor von Ganzzahlen und kopiert sie in einen kleineren und einen größeren Vektor.
#include <algorithm> #include <functional> #include <iostream> #include <string_view> #include <type_traits> #include <vector> void println(std::string_view rem, const auto& v) { std::cout << rem; if constexpr (std::is_scalar_v<std::decay_t<decltype(v)>>) std::cout << v; else for (int e : v) std::cout << e << ' '; std::cout << '\n'; } int main() { const auto v0 = {4, 2, 5, 1, 3}; std::vector<int> v1{10, 11, 12}; std::vector<int> v2{10, 11, 12, 13, 14, 15, 16}; std::vector<int>::iterator it; it = std::partial_sort_copy(v0.begin(), v0.end(), v1.begin(), v1.end()); println("Writing to the smaller vector in ascending order gives: ", v1); if (it == v1.end()) println("The return value is the end iterator", ' '); it = std::partial_sort_copy(v0.begin(), v0.end(), v2.begin(), v2.end(), std::greater<int>()); println("Writing to the larger vector in descending order gives: ", v2); println("The return value is the iterator to ", *it); }
Ausgabe:
Writing to the smaller vector in ascending order gives: 1 2 3 The return value is the end iterator Writing to the larger vector in descending order gives: 5 4 3 2 1 15 16 The return value is the iterator to 15
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| P0896R4 | C++98 | * first musste nicht beschreibbar sein für d_first | das Programm ist fehlerhaft, wenn nicht beschreibbar |
Siehe auch
|
sortiert die ersten N Elemente eines Bereichs
(Funktions-Template) |
|
|
sortiert einen Bereich in aufsteigender Reihenfolge
(Funktions-Template) |
|
|
sortiert einen Bereich von Elementen unter Beibehaltung der Reihenfolge gleicher Elemente
(Funktions-Template) |
|
|
(C++20)
|
kopiert und teilweise sortiert einen Bereich von Elementen
(Algorithmus-Funktionsobjekt) |