Namespaces
Variants

std::ranges::partition_point

Von de.cppreference.net
 
 
Algorithmen-Bibliothek
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)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
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)
Merge-Operationen (auf sortierten Bereichen)
Heap-Operationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
Eingeschränkte Algorithmen
Alle Namen in diesem Menü gehören zum Namensraum std::ranges
Nicht-modifizierende Sequenzoperationen
Modifizierende Sequenzoperationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen (auf sortierten Bereichen)
       
       
Mengenoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum/Maximum-Operationen
       
       
Permutationsoperationen
Faltungsoperationen
Operationen auf nicht initialisiertem Speicher
Rückgabetypen
 
Definiert in Header <algorithm>
Aufrufsignatur
template< std::forward_iterator I, std::sentinel_for<I> S,
          class Proj = std::identity,
          std::indirect_unary_predicate<std::projected<I, Proj>> Pred >
constexpr I
    partition_point( I first, S last, Pred pred, Proj proj = {} );
(1) (seit C++20)
template< ranges::forward_range R,
          class Proj = std::identity,
          std::indirect_unary_predicate<
              std::projected<ranges::iterator_t<R>, Proj>> Pred >
constexpr ranges::borrowed_iterator_t<R>
    partition_point( R&& r, Pred pred, Proj proj = {} );
(2) (seit C++20)

Untersucht den partitionierten (wie durch ranges::partition) Bereich [first, last) oder r und lokalisiert das Ende der ersten Partition, d. h. das projizierte Element, das pred nicht erfüllt, oder last falls alle projizierten Elemente pred erfüllen.

Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell als Niebloids bekannt), das heißt:

Parameter

first, last - das Iterator-Sentinel-Paar, das den teilweise geordneten Bereich der zu untersuchenden Elemente definiert
r - der teilweise geordnete Bereich, der untersucht werden soll
pred - Prädikat, das auf die projizierten Elemente angewendet wird
proj - Projektion, die auf die Elemente angewendet wird

Rückgabewert

Der Iterator nach dem Ende der ersten Partition innerhalb [ first , last ) oder der Iterator gleich last falls alle projizierten Elemente pred erfüllen.

Komplexität

Bei gegebenem N = ranges:: distance ( first, last ) führt O(log N) Anwendungen des Prädikats pred und der Projektion proj durch.

Wenn Sentinels jedoch nicht std:: sized_sentinel_for < I > modellieren, ist die Anzahl der Iterator-Inkremente O(N) .

Hinweise

Dieser Algorithmus ist eine allgemeinere Form von ranges::lower_bound , der mithilfe von ranges::partition_point mit dem Prädikat [ & ] ( auto const & e ) { return std:: invoke ( pred, e, value ) ; } ) ; ausgedrückt werden kann.

Beispiel

#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
auto print_seq = [](auto rem, auto first, auto last)
{
    for (std::cout << rem; first != last; std::cout << *first++ << ' ') {}
    std::cout << '\n';
};
int main()
{
    std::array v {1, 2, 3, 4, 5, 6, 7, 8, 9};
    auto is_even = [](int i) { return i % 2 == 0; };
    std::ranges::partition(v, is_even);
    print_seq("Nach Partitionierung, v: ", v.cbegin(), v.cend());
    const auto pp = std::ranges::partition_point(v, is_even);
    const auto i = std::ranges::distance(v.cbegin(), pp);
    std::cout << "Partitionspunkt ist bei " << i << "; v[" << i << "] = " << *pp << '\n';
    print_seq("Erste Partition (alle geraden Elemente): ", v.cbegin(), pp);
    print_seq("Zweite Partition (alle ungeraden Elemente): ", pp, v.cend());
}

Mögliche Ausgabe:

Nach Partitionierung, v: 2 4 6 8 5 3 7 1 9
Partitionspunkt ist bei 4; v[4] = 5
Erste Partition (alle geraden Elemente): 2 4 6 8
Zweite Partition (alle ungeraden Elemente): 5 3 7 1 9

Siehe auch

prüft, ob ein Bereich sortiert ist
(Algorithmus-Funktionsobjekt)
findet das erste Element, das nicht kleiner als der gegebene Wert ist, unter Verwendung einer binären Suche
(Algorithmus-Funktionsobjekt)
lokalisiert den Teilungspunkt eines geteilten Bereichs
(Funktionsschablone)