std:: is_sorted_until
|
Definiert im Header
<algorithm>
|
||
|
template
<
class
ForwardIt
>
ForwardIt is_sorted_until ( ForwardIt first, ForwardIt last ) ; |
(1) |
(seit C++11)
(constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt
>
ForwardIt is_sorted_until
(
ExecutionPolicy
&&
policy,
|
(2) | (seit C++17) |
|
template
<
class
ForwardIt,
class
Compare
>
ForwardIt is_sorted_until
(
ForwardIt first, ForwardIt last,
|
(3) |
(seit C++11)
(constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
Compare
>
ForwardIt is_sorted_until
(
ExecutionPolicy
&&
policy,
|
(4) | (seit C++17) |
Untersucht den Bereich
[
first
,
last
)
und findet den größten Bereich beginnend bei
first
, in dem die Elemente in nicht-absteigender Reihenfolge sortiert 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) |
Inhaltsverzeichnis |
Parameter
| first, last | - | das Paar von Iteratoren, das den Bereich der zu untersuchenden Elemente 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
geordnet
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 | ||
-
ForwardIt
muss die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||
-
Compare
muss die Anforderungen von
Compare
erfüllen.
|
||
Rückgabewert
Die obere Schranke des größten Bereichs, beginnend bei
first
, in dem die Elemente in aufsteigender Reihenfolge sortiert sind. Das heißt, der letzte Iterator
it
, für den der Bereich
[
first
,
it
)
sortiert ist.
Gibt last für leere Bereiche und Bereiche der Länge eins zurück.
Komplexität
Gegeben N als std:: distance ( first, last ) :
Exceptions
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 allokieren kann, wird std::bad_alloc geworfen.
Mögliche Implementierung
Siehe auch die Implementierungen in libstdc++ und libc++ .
| is_sorted_until (1) |
|---|
template<class ForwardIt> constexpr //< since C++20 ForwardIt is_sorted_until(ForwardIt first, ForwardIt last) { return std::is_sorted_until(first, last, std::less<>()); } |
| is_sorted_until (2) |
template<class ForwardIt, class Compare> constexpr //< since C++20 ForwardIt is_sorted_until(ForwardIt first, ForwardIt last, Compare comp) { if (first != last) { ForwardIt next = first; while (++next != last) { if (comp(*next, *first)) return next; first = next; } } return last; } |
Beispiel
#include <algorithm> #include <cassert> #include <iostream> #include <iterator> #include <random> #include <string> int main() { std::random_device rd; std::mt19937 g(rd()); const int N = 6; int nums[N] = {3, 1, 4, 1, 5, 9}; const int min_sorted_size = 4; for (int sorted_size = 0; sorted_size < min_sorted_size;) { std::shuffle(nums, nums + N, g); int *const sorted_end = std::is_sorted_until(nums, nums + N); sorted_size = std::distance(nums, sorted_end); assert(sorted_size >= 1); for (const auto i : nums) std::cout << i << ' '; std::cout << ": " << sorted_size << " initial sorted elements\n" << std::string(sorted_size * 2 - 1, '^') << '\n'; } }
Mögliche Ausgabe:
4 1 9 5 1 3 : 1 initial sorted elements ^ 4 5 9 3 1 1 : 3 initial sorted elements ^^^^^ 9 3 1 4 5 1 : 1 initial sorted elements ^ 1 3 5 4 1 9 : 3 initial sorted elements ^^^^^ 5 9 1 1 3 4 : 2 initial sorted elements ^^^ 4 9 1 5 1 3 : 2 initial sorted elements ^^^ 1 1 4 9 5 3 : 4 initial sorted elements ^^^^^^^
Siehe auch
|
(C++11)
|
prüft, ob ein Bereich in aufsteigender Reihenfolge sortiert ist
(Funktions-Template) |
|
(C++20)
|
findet den größten sortierten Teilbereich
(Algorithmus-Funktionsobjekt) |