Namensräume
Varianten
Aktionen

std::partial_sort_copy

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
partial_sort_copy
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
 
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 Elemente im Bereich [firstlast) aufsteigend und speichert das Ergebnis im Bereich [d_firstd_last).

Es werden höchstens d_last - d_first Elemente sortiert in den Bereich [d_firstd_first + n) platziert. n ist die Anzahl der zu sortierenden Elemente (std::min(std::distance(first, last), d_last - d_first)). Die Reihenfolge von gleichwertigen Elementen ist nicht garantiert erhalten zu bleiben.

1) Die Elemente werden bezüglich operator<(bis C++20)std::less{}(seit C++20) sortiert.
3) Die Elemente werden bezüglich comp sortiert.
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)

Wenn *first nicht nach d_first beschreibbar ist, ist das Programm schlecht definiert.

Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert

(bis C++11)
(seit C++11)

Inhalt

[bearbeiten] Parameter

first, last - das Paar von Iteratoren, das den zu sortierenden Bereich von Elementen definiert
d_first, d_last - das Iteratorenpaar, das den Bereich der Elemente definiert, denen die sortierten Daten zugewiesen werden
policy - die Ausführungsrichtlinie, die verwendet werden soll
comp - Vergleichsfunktions-Objekt (d.h. ein Objekt, das die Anforderungen an Compare erfüllt), das ​true zurückgibt, wenn das erste Argument *weniger* (d.h. *vorher*) als das zweite geordnet ist.

Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein

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

Obwohl die Signatur nicht unbedingt const& haben muss, darf die Funktion die übergebenen Objekte nicht verändern und muss in der Lage sein, alle Werte vom Typ (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie zu akzeptieren (daher ist Type1& nicht erlaubt, ebenso wenig Type1, es sei denn, für Type1 ist ein Move äquivalent zu einem Kopieren(since 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
-
InputIt muss die Anforderungen von LegacyInputIterator erfüllen.
-
ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen.
-
RandomIt muss die Anforderungen an einen LegacyRandomAccessIterator erfüllen.
-
Compare muss die Anforderungen an Compare erfüllen.

[bearbeiten] 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).

[bearbeiten] 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 mit operator<(bis C++20)std::less{}(seit C++20).
3,4) Ungefähr N·log(min(N,D)) Aufrufe des Komparators 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] Mögliche Implementierung

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

[bearbeiten] Beispiel

Der folgende Code sortiert einen Vektor von Integers 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

[bearbeiten] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
P0896R4 C++98 *first war nicht erforderlich, nach d_first beschreibbar zu sein das Programm ist schlecht definiert, wenn nicht beschreibbar

[bearbeiten] Siehe auch

Sortiert die ersten N Elemente eines Bereichs
(Funktionstemplate) [edit]
Sortiert einen Bereich aufsteigend
(Funktionstemplate) [edit]
Sortiert einen Bereich von Elementen und behält dabei die Reihenfolge zwischen gleichen Elementen bei
(Funktionstemplate) [edit]
Kopiert und sortiert einen Bereich von Elementen teilweise
(Algorithmus-Funktionsobjekt)[edit]