Namespaces
Variants

std::partial_sort_copy

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    
Batch-Operationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ändernde Operationen der Reihenfolge
(bis C++17)(C++11)
(C++20)(C++20)
Sampling-Operationen
(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 in Header <algorithm>
template< class InputIt, class RandomIt >
RandomIt partial_sort_copy( InputIt first, InputIt last,
                            RandomIt d_first, RandomIt d_last );
(1) (constexpr seit C++20)
template< class ExecutionPolicy,
          class ForwardIt, class RandomIt >
RandomIt partial_sort_copy( ExecutionPolicy&& policy,
                            ForwardIt first, ForwardIt last,
                            RandomIt d_first, RandomIt d_last );
(2) (seit C++17)
template< class InputIt, class RandomIt, class Compare >
RandomIt partial_sort_copy( InputIt first, InputIt last,
                            RandomIt d_first, RandomIt d_last,
                            Compare comp );
(3) (constexpr seit C++20)
template< class ExecutionPolicy,
          class ForwardIt, class RandomIt, class Compare >
RandomIt partial_sort_copy( ExecutionPolicy&& policy,
                            ForwardIt first, ForwardIt last,
                            RandomIt d_first, RandomIt d_last,
                            Compare comp );
(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 der Elemente werden sortiert in den Bereich [d_first, d_first + n) gesetzt. n ist die Anzahl der zu sortierenden Elemente (std::min(std::distance(first, last), d_last - d_first)). Die Reihenfolge gleicher Elemente ist nicht garantiert erhalten zu bleiben.

1) Die Elemente werden sortiert bezüglich operator<(bis C++20)std::less{}(seit C++20).
3) Die Elemente werden sortiert bezüglich comp.
2,4) Wie (1,3), aber ausgeführt gemäß policy.
Diese Überladungen nehmen nur 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)

Wenn *first nicht beschreibbar nach 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)

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 Ausführungsrichtlinie , die verwendet werden soll
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. geordnet vor) dem zweiten ist.

Die Signatur der Vergleichsfunktion sollte der folgenden entsprechen:

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

Während die Signatur kein const& haben muss, darf die Funktion die ihr übergebenen Objekte nicht modifizieren 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, und auch nicht Type1, es sei denn, für Type1 ist eine Bewegung äquivalent zu einer Kopie(seit C++11)).
Die Typen Type1 und Type2 müssen so sein, dass ein Objekt des Typs RandomIt dereferenziert und dann implizit in beide konvertiert werden kann. ​

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 zum 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:

1,2) Ungefähr N·log(min(N,D)) Vergleiche unter Verwendung von operator<(bis C++20)std::less{}(seit C++20).
3,4) Ungefähr N·log(min(N,D)) Anwendungen des Vergleichs 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 implementationsabhängig.
  • Wenn der Algorithmus keinen Speicher allozieren kann, wird std::bad_alloc ausgelöst.

Mögliche Implementierung

Siehe auch die Implementierungen in libstdc++ und libc++.

Beispiel

Der folgende Code sortiert einen Vektor von ganzen Zahlen 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 war nicht erforderlich beschreibbar nach d_first das Programm ist fehlerhaft, wenn nicht beschreibbar

Siehe auch

sortiert die ersten N Elemente eines Bereichs
(Funktionsvorlage & Algorithmus-Funktionsobjekt)
sortiert einen Bereich von Elementen
(Funktionsvorlage & Algorithmus-Funktionsobjekt)
sortiert einen Bereich von Elementen unter Beibehaltung der relativen Reihenfolge zwischen äquivalenten Elementen
(Funktionsvorlage & Algorithmus-Funktionsobjekt)
kopiert und sortiert einen Bereich von Elementen teilweise
(Algorithmus-Funktionsobjekt)