std::is_sorted_until
| Definiert in 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,
ForwardIt first, ForwardIt last );
|
(2) | (seit C++17) |
template< class ForwardIt, class Compare >
ForwardIt is_sorted_until( ForwardIt first, ForwardIt last,
Compare comp );
|
(3) | (seit C++11) (constexpr seit C++20) |
template< class ExecutionPolicy, class ForwardIt, class Compare >
ForwardIt is_sorted_until( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last,
Compare comp );
|
(4) | (seit C++17) |
Untersucht den Bereich [first, last) und findet den größten Bereich, der bei first beginnt, in dem die Elemente in nicht-absteigender Reihenfolge sortiert sind.
operator<(bis C++20)std::less{}(seit C++20).comp.policy.true ist:
|
|
(bis C++20) |
|
|
(seit C++20) |
Parameter
| first, last | - | das Paar von Iteratoren, das den Bereich der zu untersuchenden Elemente definiert |
| 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 ist als (d. h. in der Ordnung vor) dem zweiten. Die Signatur der Vergleichsfunktion sollte der folgenden entsprechen:
Während die Signatur nicht |
| dereferenziert und dann implizit in beide konvertiert werden kann. | ||
Typanforderungen
ForwardIt- muss die Anforderungen von LegacyForwardIterator | ||
erfüllen.
Compare- muss die Anforderungen von Compare | ||
erfüllen.
RückgabewertfirstDie obere Schranke des größten Bereichs, der bei it beginnt und in dem die Elemente in aufsteigender Reihenfolge sortiert sind. Das ist der letzte Iterator [first, it), für den der Bereich
sortiert ist.
lastGibt
für leere Bereiche und Bereiche der Länge eins zurück.
Komplexität\(\scriptsize N\)Nstd::distance(first, last) als
operator< Vergleiche mit std::less{}(bis C++20)(seit C++20)comp Anwendungen des Vergleichs .
AusnahmenExecutionPolicyDie Überladungen mit einem Vorlagenparameter namens
- melden Fehler wie folgt:
ExecutionPolicyWenn die Ausführung einer im Rahmen des Algorithmus aufgerufenen Funktion eine Ausnahme auslöst und eine der Standardrichtlinien ist, wird std::terminateExecutionPolicyaufgerufen. Für jede andere - ist das Verhalten implementierungsdefiniert.Wenn der Algorithmus keinen Speicher zuweisen kann, wird std::bad_alloc
ausgelöst.
Mögliche ImplementierungSiehe auch die Implementierungen in libstdc++ und libc++
| . |
|---|
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 (1) |
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;
}
|
is_sorted_until (2)
#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';
}
}
Dieses Programm ausführen
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
^^^^^^^
Mögliche Ausgabe:
is_sorted |
(C++11) prüft, ob ein Bereich sortiert ist&(Funktionsvorlage |
ranges::is_sorted |
|
ranges::is_sorted_until |
(C++20) findet den größten sortierten Teilbereich |