std:: nth_element
|
Definiert in Header
<algorithm>
|
||
|
template
<
class
RandomIt
>
void nth_element ( RandomIt first, RandomIt nth, RandomIt last ) ; |
(1) | (constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
RandomIt
>
void
nth_element
(
ExecutionPolicy
&&
policy,
|
(2) | (seit C++17) |
|
template
<
class
RandomIt,
class
Compare
>
void
nth_element
(
RandomIt first, RandomIt nth, RandomIt last,
|
(3) | (constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
RandomIt,
class
Compare
>
void
nth_element
(
ExecutionPolicy
&&
policy,
|
(4) | (seit C++17) |
nth_element
ordnet Elemente in
[
first
,
last
)
so um, dass nach der Umordnung gilt:
-
Das Element, auf das
nth
zeigt, wird zu dem Element geändert, das an dieser Position auftreten würde, wenn
[first,last)sortiert wäre. -
Für jeden Iterator
i
in
[first,nth)und jeden Iterator j in[nth,last), ist die folgende Bedingung erfüllt:
|
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 eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:
-
[first,nth)oder[nth,last)ist kein gültiger Bereich .
|
(bis C++11) |
|
(seit C++11) |
Inhaltsverzeichnis |
Parameter
| first, last | - | das Paar von Iteratoren, das den Bereich der Elemente für das partielle Sortieren definiert |
| nth | - | Random-Access-Iterator, der den Sortierpartitionierungspunkt definiert |
| 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 Folgender sein: bool cmp ( const Type1 & a, const Type2 & b ) ;
Obwohl die Signatur keine
const
&
benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte des Typs (möglicherweise const)
|
| Typanforderungen | ||
-
RandomIt
muss die Anforderungen von
LegacyRandomAccessIterator
erfüllen.
|
||
-
Compare
muss die Anforderungen von
Compare
erfüllen.
|
||
Komplexität
Gegeben N als last - 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++ , libc++ , und MSVC STL .
Hinweise
Der verwendete Algorithmus ist typischerweise Introselect , obwohl auch andere Selection algorithm mit geeigneter Average-Case-Komplexität erlaubt sind.
Beispiel
#include <algorithm> #include <cassert> #include <functional> #include <iostream> #include <numeric> #include <vector> void printVec(const std::vector<int>& vec) { std::cout << "v = {"; for (char sep[]{0, ' ', 0}; const int i : vec) std::cout << sep << i, sep[0] = ','; std::cout << "};\n"; } int main() { std::vector<int> v{5, 10, 6, 4, 3, 2, 6, 7, 9, 3}; printVec(v); auto m = v.begin() + v.size() / 2; std::nth_element(v.begin(), m, v.end()); std::cout << "\nThe median is " << v[v.size() / 2] << '\n'; // Die Konsequenz der Ungleichheit der Elemente vor/nach dem N-ten Element: assert(std::accumulate(v.begin(), m, 0) < std::accumulate(m, v.end(), 0)); printVec(v); // Hinweis: Vergleichsfunktion wurde geändert std::nth_element(v.begin(), v.begin() + 1, v.end(), std::greater{}); std::cout << "\nThe second largest element is " << v[1] << '\n'; std::cout << "The largest element is " << v[0] << '\n'; printVec(v); }
Mögliche Ausgabe:
v = {5, 10, 6, 4, 3, 2, 6, 7, 9, 3};
The median is 6
v = {3, 2, 3, 4, 5, 6, 10, 7, 9, 6};
The second largest element is 9
The largest element is 10
v = {10, 9, 6, 7, 6, 3, 5, 4, 3, 2};
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 |
|---|---|---|---|
| LWG 2150 | C++98 |
nach der Neuordnung war nur ein Element vor
nth
erforderlich, das nicht größer als ein Element nach nth war |
Anforderung korrigiert |
| LWG 2163 | C++98 | Überladung ( 1 ) verwendete operator > zum Vergleichen der Elemente | geändert zu operator < |
| P0896R4 | C++98 |
[
first
,
nth
)
und
[
nth
,
last
)
mussten keine gültigen Bereiche sein |
das Verhalten ist undefiniert
falls einer von ihnen ungültig ist |
Siehe auch
|
gibt das größte Element in einem Bereich zurück
(Funktions-Template) |
|
|
gibt das kleinste Element in einem Bereich zurück
(Funktions-Template) |
|
|
kopiert und sortiert teilweise einen Bereich von Elementen
(Funktions-Template) |
|
|
sortiert einen Bereich von Elementen unter Beibehaltung der Reihenfolge gleicher Elemente
(Funktions-Template) |
|
|
sortiert einen Bereich in aufsteigender Reihenfolge
(Funktions-Template) |
|
|
(C++20)
|
sortiert den gegebenen Bereich teilweise und stellt sicher, dass er durch das gegebene Element partitioniert wird
(Algorithmus-Funktionsobjekt) |