Namespaces
Variants

std::is_sorted_until

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)
Swap-Operationen
Transformationsoperationen
Erzeugungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(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 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.

1) Findet den größten Bereich, ob die Elemente sortiert sind bezüglich operator<(bis C++20)std::less{}(seit C++20).
3) Findet den größten Bereich, ob die Elemente sortiert sind 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)

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:

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

Während die Signatur nicht const& haben muss, darf die Funktion die ihr übergebenen Objekte nicht verändern 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, auch nicht Type1, es sei denn, Type1 für ist eine Verschiebung gleichbedeutend mit einer Kopie(seit C++11)
).Type1 Die Typen Type2 und ForwardIt müssen so sein, dass ein Objekt vom Typ

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

: \(\scriptsize O(N)\)O(N)operator< Vergleiche mit std::less{}(bis C++20)(seit C++20)
. \(\scriptsize O(N)\)O(N)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::terminateExecutionPolicy aufgerufen. 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_until
(C++20)
findet den größten sortierten Teilbereich