std::ranges:: find_first_of
std::ranges
| Non-modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Partitioning operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Sorting operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Binary search operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Set operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Heap operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Minimum/maximum operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Permutation operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fold operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Operations on uninitialized storage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Return types | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definiert im Header
<algorithm>
|
||
|
Aufrufsignatur
|
||
|
template
<
std::
input_iterator
I1,
std::
sentinel_for
<
I1
>
S1,
std::
forward_iterator
I2,
std::
sentinel_for
<
I2
>
S2,
|
(1) | (seit C++20) |
|
template
<
ranges::
input_range
R1,
ranges::
forward_range
R2,
class
Pred
=
ranges::
equal_to
,
|
(2) | (seit C++20) |
[
first1
,
last1
)
nach
irgendeinem
der Elemente im Bereich
[
first2
,
last2
)
, nachdem die Bereiche mit
proj1
und
proj2
projiziert wurden. Die projizierten Elemente werden mit dem binären Prädikat
pred
verglichen.
Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithm Function Objects (informell bekannt als Niebloids ), das heißt:
- Explizite Template-Argumentlisten können beim Aufruf keiner von ihnen angegeben werden.
- Keiner von ihnen ist sichtbar für argument-dependent lookup .
- Wenn einer von ihnen durch normal unqualified lookup als Name links vom Funktionsaufruf-Operator gefunden wird, wird argument-dependent lookup unterdrückt.
Inhaltsverzeichnis |
Parameter
| first1, last1 | - | das Iterator-Sentinel-Paar, das den Bereich der zu untersuchenden Elemente definiert (auch bekannt als haystack ) |
| first2, last2 | - | das Iterator-Sentinel-Paar, das den Bereich der zu suchenden Elemente definiert (auch bekannt als needles ) |
| r1 | - | der Bereich der zu untersuchenden Elemente (auch bekannt als haystack ) |
| r2 | - | der Bereich der zu suchenden Elemente (auch bekannt als needles ) |
| pred | - | binäres Prädikat zum Vergleichen der Elemente |
| proj1 | - | Projektion, die auf die Elemente im ersten Bereich anzuwenden ist |
| proj2 | - | Projektion, die auf die Elemente im zweiten Bereich anzuwenden ist |
Rückgabewert
Iterator zum ersten Element im Bereich
[
first1
,
last1
)
, das nach der Projektion einem Element aus dem Bereich
[
first2
,
last2
)
entspricht. Falls kein solches Element gefunden wird, wird ein Iterator zurückgegeben, der gleich
last1
ist.
Komplexität
Höchstens
S
*
N
Anwendungen des Prädikats und jeder Projektion, wobei
(1)
S
=
ranges::
distance
(
first2, last2
)
und
N
=
ranges::
distance
(
first1, last1
)
;
(2)
S
=
ranges::
distance
(
r2
)
und
N
=
ranges::
distance
(
r1
)
.
Mögliche Implementierung
struct find_first_of_fn { template<std::input_iterator I1, std::sentinel_for<I1> S1, std::forward_iterator I2, std::sentinel_for<I2> S2, class Pred = ranges::equal_to, class Proj1 = std::identity, class Proj2 = std::identity> requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2> constexpr I1 operator()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) const { for (; first1 != last1; ++first1) for (auto i = first2; i != last2; ++i) if (std::invoke(pred, std::invoke(proj1, *first1), std::invoke(proj2, *i))) return first1; return first1; } template<ranges::input_range R1, ranges::forward_range R2, class Pred = ranges::equal_to, class Proj1 = std::identity, class Proj2 = std::identity> requires std::indirectly_comparable<ranges::iterator_t<R1>, ranges::iterator_t<R2>, Pred, Proj1, Proj2> constexpr ranges::borrowed_iterator_t<R1> operator()(R1&& r1, R2&& r2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) const { return (*this)(ranges::begin(r1), ranges::end(r1), ranges::begin(r2), ranges::end(r2), std::move(pred), std::move(proj1), std::move(proj2)); } }; inline constexpr find_first_of_fn find_first_of {}; |
Beispiel
#include <algorithm> #include <iostream> #include <iterator> int main() { namespace rng = std::ranges; constexpr static auto haystack = {1, 2, 3, 4}; constexpr static auto needles = {0, 3, 4, 3}; constexpr auto found1 = rng::find_first_of(haystack.begin(), haystack.end(), needles.begin(), needles.end()); static_assert(std::distance(haystack.begin(), found1) == 2); constexpr auto found2 = rng::find_first_of(haystack, needles); static_assert(std::distance(haystack.begin(), found2) == 2); constexpr static auto negatives = {-6, -3, -4, -3}; constexpr auto not_found = rng::find_first_of(haystack, negatives); static_assert(not_found == haystack.end()); constexpr auto found3 = rng::find_first_of(haystack, negatives, [](int x, int y) { return x == -y; }); // uses a binary comparator static_assert(std::distance(haystack.begin(), found3) == 2); struct P { int x, y; }; constexpr static auto p1 = {P{1, -1}, P{2, -2}, P{3, -3}, P{4, -4}}; constexpr static auto p2 = {P{5, -5}, P{6, -3}, P{7, -5}, P{8, -3}}; // Compare only P::y data members by projecting them: const auto found4 = rng::find_first_of(p1, p2, {}, &P::y, &P::y); std::cout << "First equivalent element {" << found4->x << ", " << found4->y << "} was found at position " << std::distance(p1.begin(), found4) << ".\n"; }
Ausgabe:
First equivalent element {3, -3} was found at position 2.
Siehe auch
|
sucht nach einem Element aus einer Menge von Elementen
(Funktions-Template) |
|
|
(C++20)
|
findet die ersten zwei benachbarten Elemente, die gleich sind (oder ein gegebenes Prädikat erfüllen)
(Algorithmus-Funktionsobjekt) |
|
(C++20)
(C++20)
(C++20)
|
findet das erste Element, das bestimmte Kriterien erfüllt
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
findet die letzte Sequenz von Elementen in einem bestimmten Bereich
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
sucht nach dem ersten Vorkommen eines Bereichs von Elementen
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
sucht nach dem ersten Vorkommen einer Anzahl aufeinanderfolgender Kopien eines Elements in einem Bereich
(Algorithmus-Funktionsobjekt) |