Namensräume
Varianten
Aktionen

std::search_n

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Definiert in Header <algorithm>
(1)
template< class ForwardIt, class Size, class T >

ForwardIt search_n( ForwardIt first, ForwardIt last,

                    Size count, const T& value );
(constexpr seit C++20)
(bis C++26)
template< class ForwardIt, class Size,

          class T = typename std::iterator_traits
                        <ForwardIt>::value_type >
constexpr ForwardIt search_n( ForwardIt first, ForwardIt last,

                              Size count, const T& value );
(seit C++26)
(2)
template< class ExecutionPolicy,

          class ForwardIt, class Size, class T >
ForwardIt search_n( ExecutionPolicy&& policy,
                    ForwardIt first, ForwardIt last,

                    Size count, const T& value );
(seit C++17)
(bis C++26)
template< class ExecutionPolicy,

          class ForwardIt, class Size,
          class T = typename std::iterator_traits
                        <ForwardIt>::value_type >
ForwardIt search_n( ExecutionPolicy&& policy,
                    ForwardIt first, ForwardIt last,

                    Size count, const T& value );
(seit C++26)
(3)
template< class ForwardIt, class Size, class T, class BinaryPred >

ForwardIt search_n( ForwardIt first, ForwardIt last,

                    Size count, const T& value, BinaryPred p );
(constexpr seit C++20)
(bis C++26)
template< class ForwardIt, class Size,

          class T = typename std::iterator_traits
                        <ForwardIt>::value_type,
          class BinaryPred >
constexpr ForwardIt search_n( ForwardIt first, ForwardIt last,

                    Size count, const T& value, BinaryPred p );
(seit C++26)
(4)
template< class ExecutionPolicy, class ForwardIt, class Size,

          class T, class BinaryPred >
ForwardIt search_n( ExecutionPolicy&& policy,
                    ForwardIt first, ForwardIt last,

                    Size count, const T& value, BinaryPred p );
(seit C++17)
(bis C++26)
template< class ExecutionPolicy, class ForwardIt, class Size,

          class T = typename std::iterator_traits
                        <ForwardIt>::value_type,
          class BinaryPred >
ForwardIt search_n( ExecutionPolicy&& policy,
                    ForwardIt first, ForwardIt last,

                    Size count, const T& value, BinaryPred p );
(seit C++26)

Durchsucht den Bereich [firstlast) nach der ersten Sequenz von count identischen Elementen, die jeweils gleich dem gegebenen value sind.

1) Elemente werden mit operator== verglichen.
3) Elemente werden mit dem gegebenen binären Prädikat p verglichen.
2,4) Dasselbe wie (1,3), aber ausgeführt gemäß policy.
Diese Überladungen nehmen an der Auflösungsauflösung teil, nur wenn alle folgenden Bedingungen erfüllt 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)

Inhalt

[bearbeiten] Parameter

first, last - das Iteratorenpaar, das den Bereich der zu untersuchenden Elemente definiert
zählt - die Länge der zu durchsuchenden Sequenz
value - der Wert der zu durchsuchenden Elemente
policy - die Ausführungsrichtlinie, die verwendet werden soll
p - binäre Prädikatfunktion, die ​true zurückgibt, wenn die Elemente als gleich behandelt werden sollen.

Die Signatur der Prädikatfunktion sollte äquivalent zur folgenden sein:

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

Obwohl die Signatur nicht zwingend const & haben muss, darf die Funktion die ihr übergebenen Objekte nicht modifizieren und muss alle Werte vom Typ (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie akzeptieren können (daher ist Type1 & nicht erlaubt, ebenso wenig wie Type1, es sei denn, für Type1 ist eine Verschiebung gleichbedeutend mit einer Kopie(seit C++11)).
Der Typ Type1 muss so beschaffen sein, dass ein Objekt vom Typ ForwardIt dereferenziert und dann implizit in Type1 konvertiert werden kann. Der Typ Type2 muss so beschaffen sein, dass ein Objekt vom Typ T implizit in Type2 konvertiert werden kann. ​

Typanforderungen
-
ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen.
-
BinaryPred muss die Anforderungen an BinaryPredicate erfüllen.
-
Size muss konvertierbar in einen ganzzahligen Typ sein.

[bearbeiten] Rückgabewert

Wenn count positiv ist, wird ein Iterator zurückgegeben, der auf den Anfang der ersten gefundenen Sequenz im Bereich [firstlast) zeigt. Jeder Iterator it in der Sequenz muss die folgende Bedingung erfüllen:

1,2) *it == value ist true.
3,4) p(*it, value) != false ist true.

Wenn keine solche Sequenz gefunden wird, wird last zurückgegeben.

Wenn count null oder negativ ist, wird first zurückgegeben.

[bearbeiten] Komplexität

Gegeben sei N als std::distance(first, last).

1,2) Höchstens N Vergleiche mittels operator==.
3,4) Höchstens N Anwendungen des Prädikats p.

[bearbeiten] Ausnahmen

Die Überladungen mit einem Template-Parameter namens ExecutionPolicy berichten Fehler wie folgt

  • Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsabhängig.
  • Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.

[bearbeiten] Mögliche Implementierung

search_n (1)
template<class ForwardIt, class Size,
         class T = typename std::iterator_traits<ForwardIt>::value_type>
ForwardIt search_n(ForwardIt first, ForwardIt last, Size count, const T& value)
{
    if (count <= 0)
        return first;
 
    for (; first != last; ++first)
    {
        if (!(*first == value))
            continue;
 
        ForwardIt candidate = first;
 
        for (Size cur_count = 1; true; ++cur_count)
        {
            if (cur_count >= count)
                return candidate; // success
 
            ++first;
            if (first == last)
                return last; // exhausted the list
 
            if (!(*first == value))
                break; // too few in a row
        }
    }
    return last;
}
search_n (3)
template<class ForwardIt, class Size,
         class T = typename std::iterator_traits<ForwardIt>::value_type,
         class BinaryPred>
ForwardIt search_n(ForwardIt first, ForwardIt last, Size count, const T& value,
                   BinaryPred p)
{
    if (count <= 0)
        return first;
 
    for (; first != last; ++first)
    {
        if (!p(*first, value))
            continue;
 
        ForwardIt candidate = first;
 
        for (Size cur_count = 1; true; ++cur_count)
        {
            if (cur_count >= count)
                return candidate; // success
 
            ++first;
            if (first == last)
                return last; // exhausted the list
 
            if (!p(*first, value))
                break; // too few in a row
        }
    }
    return last;
}

[bearbeiten] Hinweise

Feature-Test-Makro Wert Std Feature
__cpp_lib_algorithm_default_value_type 202403 (C++26) List-Initialisierung für Algorithmen (1-4)

[bearbeiten] Beispiel

#include <algorithm>
#include <cassert>
#include <complex>
#include <iostream>
#include <iterator>
#include <vector>
 
template<class Container, class Size, class T>
constexpr bool consecutive_values(const Container& c, Size count, const T& v)
{
    return std::search_n(std::begin(c), std::end(c), count, v) != std::end(c);
}
 
int main()
{
    constexpr char sequence[] = ".0_0.000.0_0.";
 
    static_assert(consecutive_values(sequence, 3, '0'));
 
    for (int n : {4, 3, 2})
        std::cout << std::boolalpha
                  << "Has " << n << " consecutive zeros: "
                  << consecutive_values(sequence, n, '0') << '\n';
 
    std::vector<std::complex<double>> nums{{4, 2}, {4, 2}, {1, 3}};
    #ifdef __cpp_lib_algorithm_default_value_type
        auto it = std::search_n(nums.cbegin(), nums.cend(), 2, {4, 2});
    #else
        auto it = std::search_n(nums.cbegin(), nums.cend(), 2, std::complex<double>{4, 2});
    #endif
    assert(it == nums.begin());
}

Ausgabe

Has 4 consecutive zeros: false
Has 3 consecutive zeros: true
Has 2 consecutive zeros: true

[bearbeiten] 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 283 C++98 T musste EqualityComparable sein, aber
der Werttyp von InputIt ist nicht immer T
Anforderung entfernt
LWG 426 C++98 die obere Grenze der Komplexität war N·count,
ist negativ, wenn count negativ ist
die obere Grenze ist 0
wenn count nicht-positiv ist
LWG 714 C++98 wenn count > 0, war die obere Grenze der Komplexität N·count, aber in
der schlechtesten Fall ist die Anzahl der Vergleiche/Operationen immer N
die obere
Grenze wurde in diesem Fall auf N geändert
LWG 2150 C++98 Die Bedingung "Sequenzvorkommen" war falsch. korrigiert

[bearbeiten] Siehe auch

Findet die letzte Sequenz von Elementen in einem bestimmten Bereich
(Funktionstempelat) [edit]
Findet das erste Element, das bestimmte Kriterien erfüllt
(Funktionstempelat) [edit]
Sucht nach dem ersten Vorkommen eines Elementbereichs
(Funktionstempelat) [edit]
Sucht nach dem ersten Vorkommen einer Anzahl aufeinanderfolgender Kopien eines Elements in einem Bereich
(Algorithmus-Funktionsobjekt)[edit]