std::experimental::ranges::all_of, std::experimental::ranges::any_of, std::experimental::ranges::none_of
Von cppreference.com
< cpp | experimental | ranges
| Definiert in Header <experimental/ranges/algorithm> |
||
| template< InputIterator I, Sentinel<I> S, class Proj = ranges::identity, IndirectUnaryPredicate<projected<I, Proj>> Pred > |
(1) | (Ranges TS) |
| template< InputRange R, class Proj = ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred > |
(2) | (Ranges TS) |
| template< InputIterator I, Sentinel<I> S, class Proj = ranges::identity, IndirectUnaryPredicate<projected<I, Proj>> Pred > |
(3) | (Ranges TS) |
| template< InputRange R, class Proj = ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred > |
(4) | (Ranges TS) |
| template< InputIterator I, Sentinel<I> S, class Proj = identity, IndirectUnaryPredicate<projected<I, Proj>> Pred > |
(5) | (Ranges TS) |
| template< InputRange R, class Proj = ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred > |
(6) | (Ranges TS) |
1) Prüft, ob der unäre Prädikat pred für alle Elemente im Bereich
[first, last) den Wert true zurückgibt.3) Prüft, ob der unäre Prädikat pred für mindestens ein Element im Bereich
[first, last) den Wert true zurückgibt.5) Prüft, ob der unäre Prädikat pred für kein Element im Bereich
[first, last) den Wert true zurückgibt.2,4,6) Dasselbe wie (1,3,5), verwendet aber r als Quellbereich, so als würde ranges::begin(r) als first und ranges::end(r) als last verwendet werden.
Ungeachtet der oben gezeigten Deklarationen ist die tatsächliche Anzahl und Reihenfolge der Template-Parameter für Algorithmusdeklarationen nicht spezifiziert. Wenn also explizite Template-Argumente beim Aufruf eines Algorithmus verwendet werden, ist das Programm wahrscheinlich nicht portabel.
Inhalt |
[edit] Parameter
| first, last | - | der zu untersuchende Elementbereich |
| r | - | der zu untersuchende Elementbereich |
| pred | - | Prädikat, das auf die projizierten Elemente angewendet wird |
| proj | - | Projektion, die auf die Elemente angewendet wird |
[edit] Rückgabewert
1,2) true, wenn pred für alle Elemente im Bereich true zurückgibt, andernfalls false. Gibt true zurück, wenn der Bereich leer ist.
3,4) true, wenn pred für mindestens ein Element im Bereich true zurückgibt, andernfalls false. Gibt false zurück, wenn der Bereich leer ist.
5,6) true, wenn pred für kein Element im Bereich true zurückgibt, andernfalls false. Gibt true zurück, wenn der Bereich leer ist.
[edit] Komplexität
1-6) Höchstens last - first Anwendungen des Prädikats und last - first Anwendungen der Projektion.
[edit] Mögliche Implementierung
| Erste Version |
|---|
template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity, IndirectUnaryPredicate<projected<I, Proj>> Pred> bool all_of(I first, S last, Pred pred, Proj proj = Proj{}) { return ranges::find_if_not(first, last, std::ref(pred), std::ref(proj)) == last; } template<InputRange R, class Proj = ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred> bool all_of(R&& r, Pred pred, Proj proj = Proj{}) { return ranges::all_of(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); } |
| Zweite Version |
template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity, IndirectUnaryPredicate<projected<I, Proj>> Pred> bool any_of(I first, S last, Pred pred, Proj proj = Proj{}) { return ranges::find_if(first, last, std::ref(pred), std::ref(proj)) != last; } template<InputRange R, class Proj = ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred> bool any_of(R&& r, Pred pred, Proj proj = Proj{}) { return ranges::any_of(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); } |
| Dritte Version |
template<InputIterator I, Sentinel<I> S, class Proj = identity, IndirectUnaryPredicate<projected<I, Proj>> Pred> bool none_of(I first, S last, Pred pred, Proj proj = Proj{}) { return ranges::find_if(first, last, std::ref(pred), std::ref(proj)) == last; } template<InputRange R, class Proj = ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred> bool none_of(R&& r, Pred pred, Proj proj = Proj{}) { return ranges::none_of(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); } |
[edit] Beispiel
Führen Sie diesen Code aus
#include <experimental/ranges/algorithm> #include <experimental/ranges/iterator> #include <functional> #include <iostream> #include <iterator> #include <numeric> #include <vector> namespace ranges = std::experimental::ranges; int main() { std::vector<int> v(10, 2); std::partial_sum(v.cbegin(), v.cend(), v.begin()); std::cout << "Among the numbers: "; ranges::copy(v, ranges::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; if (ranges::all_of(v.cbegin(), v.cend(), [](int i) { return i % 2 == 0; })) std::cout << "All numbers are even\n"; if (ranges::none_of(v, std::bind(std::modulus<int>(), std::placeholders::_1, 2))) std::cout << "None of them are odd\n"; struct DivisibleBy { const int d; DivisibleBy(int n) : d(n) {} bool operator()(int n) const { return n % d == 0; } }; if (ranges::any_of(v, DivisibleBy(7))) std::cout << "At least one number is divisible by 7\n"; }
Ausgabe
Among the numbers: 2 4 6 8 10 12 14 16 18 20 All numbers are even None of them are odd At least one number is divisible by 7
[edit] Siehe auch
| (C++11)(C++11)(C++11) |
Prüft, ob eine Bedingung für alle, einige oder keine Elemente in einem Bereich wahr ist (Funktionstempelat) |