std::find, std::find_if, std::find_if_not
| Definiert in Header <algorithm>
|
||
template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );
|
(1) | (constexpr seit C++20) (bis C++26) |
template< class InputIt, class T = typename std::iterator_traits
<InputIt>::value_type >
constexpr InputIt find( InputIt first, InputIt last, const T& value );
|
(seit C++26) | |
template< class InputIt, class UnaryPred >
InputIt find_if( InputIt first, InputIt last, UnaryPred p );
|
(2) | (constexpr seit C++20) |
template< class InputIt, class UnaryPred >
InputIt find_if_not( InputIt first, InputIt last, UnaryPred q );
|
(3) | (seit C++11) (constexpr seit C++20) |
template< class ExecutionPolicy, class ForwardIt, class T >
ForwardIt find( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, const T& value );
|
(4) | (seit C++17) (bis C++26) |
template< class ExecutionPolicy,
class ForwardIt, class T = typename std::iterator_traits
<ForwardIt>::value_type >
ForwardIt find( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, const T& value );
|
(seit C++26) | |
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
ForwardIt find_if( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, UnaryPred p );
|
(5) | (seit C++17) |
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
ForwardIt find_if_not( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, UnaryPred q );
|
(6) | (seit C++17) |
Gibt einen Iterator zum ersten Element im Quellbereich [first, last) zurück, das bestimmte Kriterien erfüllt (oder last, falls es keinen solchen Iterator gibt).
find sucht nach dem ersten Element, das gleich value ist (unter Verwendung von operator==).find_if sucht nach dem ersten Element, für das das Prädikat p true zurückgibt.find_if_not sucht nach dem ersten Element, für das das Prädikat q false zurückgibt.policy.true ist:
|
|
(bis C++20) |
|
|
(seit C++20) |
Parameter
| first, last | - | das Paar von Iteratoren, das den Quellbereich |
| definiert | value | - |
| Wert, mit dem die Elemente verglichen werden | p | -
trueunäres Prädikat, das für das gewünschte Element zurückgibt. |
| . | q | -
falseunäres Prädikat, das für das gewünschte Element zurückgibt. |
| . | policy | - die zu verwendende Ausführungsrichtlinie |
Typanforderungen
InputIt- muss die Anforderungen von LegacyInputIterator | ||
erfüllen.
ForwardIt- muss die Anforderungen von LegacyForwardIterator | ||
erfüllen.
UnaryPredicate- muss die Anforderungen von Predicate | ||
erfüllen.
RückgabewertitDer erste Iterator last im Quellbereich, der die folgende Bedingung erfüllt, oder
*it == value1,4)true ist p(*it)2,5)true ist q(*it)3,6)false ist .
Komplexität\(\scriptsize N\)Nstd::distance(first, last) als
value Vergleiche mit operator== unter Verwendung von p Anwendungen von q Anwendungen von value Vergleiche mit operator== unter Verwendung von p Anwendungen von q Anwendungen von .
- Während des Ausführungsprozesses: Wenn die für die Parallelisierung erforderlichen temporären Speicherressourcen nicht verfügbar sind, wird std::bad_alloc
- geworfen.Wenn während des Zugriffs auf Objekte über ein Algorithmusargument eine nicht abgefangene Ausnahme geworfen wird, wird das Verhalten durch die Ausführungsrichtlinie bestimmt (für Standardrichtlinien wird std::terminate
aufgerufen).
| find |
|---|
template<class InputIt, class T = typename std::iterator_traits<InputIt>::value_type>
constexpr InputIt find(InputIt first, InputIt last, const T& value)
{
for (; first != last; ++first)
if (*first == value)
return first;
return last;
}
|
| find_if |
template<class InputIt, class UnaryPred>
constexpr InputIt find_if(InputIt first, InputIt last, UnaryPred p)
{
for (; first != last; ++first)
if (p(*first))
return first;
return last;
}
|
| find_if_not |
template<class InputIt, class UnaryPred>
constexpr InputIt find_if_not(InputIt first, InputIt last, UnaryPred q)
{
for (; first != last; ++first)
if (!q(*first))
return first;
return last;
}
|
Anmerkungen
Wenn C++11 nicht verfügbar ist, ist ein Äquivalent zu std::find_if_not die Verwendung von std::find_if mit dem negierten Prädikat.
template<class InputIt, class UnaryPred>
InputIt find_if_not(InputIt first, InputIt last, UnaryPred q)
{
return std::find_if(first, last, std::not1(q));
}
|
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403 |
(C++26) | Listeninitialisierung für Algorithmen (1,4) |
Beispiel
Das folgende Beispiel findet Zahlen in gegebenen Sequenzen.
#include <algorithm>
#include <array>
#include <cassert>
#include <complex>
#include <initializer_list>
#include <iostream>
#include <vector>
bool is_even(int i)
{
return i % 2 == 0;
}
void example_contains()
{
const auto haystack = {1, 2, 3, 4};
for (const int needle : {3, 5})
if (std::find(haystack.begin(), haystack.end(), needle) == haystack.end())
std::cout << "haystack does not contain " << needle << '\n';
else
std::cout << "haystack contains " << needle << '\n';
}
void example_predicate()
{
for (const auto& haystack : {std::array{3, 1, 4}, {1, 3, 5}})
{
const auto it = std::find_if(haystack.begin(), haystack.end(), is_even);
if (it != haystack.end())
std::cout << "haystack contains an even number " << *it << '\n';
else
std::cout << "haystack does not contain even numbers\n";
}
}
void example_list_init()
{
std::vector<std::complex<double>> haystack{{4.0, 2.0}};
#ifdef __cpp_lib_algorithm_default_value_type
// T gets deduced making list-initialization possible
const auto it = std::find(haystack.begin(), haystack.end(), {4.0, 2.0});
#else
const auto it = std::find(haystack.begin(), haystack.end(), std::complex{4.0, 2.0});
#endif
assert(it == haystack.begin());
}
int main()
{
example_contains();
example_predicate();
example_list_init();
}
Ausgabe:
haystack contains 3
haystack does not contain 5
haystack contains an even number 4
haystack does not contain even numbers
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Richtiges Verhalten |
|---|---|---|---|
| LWG 283 | C++98 | TT musste EqualityComparable sein, aberder Werttyp von könnte nicht sein InputItAnforderung entferntT
|
Siehe auch
(C++20)(C++20)(C++20) |
findet das erste Element, das bestimmte Kriterien erfüllt (Algorithmus-Funktionsobjekt) |
| findet die ersten zwei benachbarten Elemente, die gleich sind (oder ein gegebenes Prädikat erfüllen) (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
| findet die letzte Sequenz von Elementen in einem bestimmten Bereich (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
| sucht nach einem beliebigen Element einer Menge (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
| findet die erste Position, an der sich zwei Bereiche unterscheiden (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
| sucht nach dem ersten Vorkommen eines Bereichs von Elementen (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20) |