Namensräume
Varianten
Aktionen

std::ranges::views::filter, std::ranges::filter_view

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
 
Definiert in der Header-Datei <ranges>
template< ranges::input_range V,

          std::indirect_unary_predicate<ranges::iterator_t<V>> Pred >
    requires ranges::view<V> && std::is_object_v<Pred>
class filter_view

    : public ranges::view_interface<filter_view<V, Pred>>
(1) (seit C++20)
namespace views {

    inline constexpr /* nicht spezifiziert */ filter = /* nicht spezifiziert */;

}
(2) (seit C++20)
Aufruf-Signatur
template< ranges::viewable_range R, class Pred >

    requires /* siehe unten */

constexpr ranges::view auto filter( R&& r, Pred&& pred );
(seit C++20)
template< class Pred >
constexpr /* Range-Adaptor-Closure */ filter( Pred&& pred );
(seit C++20)
1) Ein Range-Adaptor, der eine view einer zugrundeliegenden Sequenz ohne die Elemente darstellt, die ein Prädikat nicht erfüllen.
2) RangeAdaptorObject. Der Ausdruck views::filter(e, p) ist ausdrucksäquivalent zu filter_view(e, p) für beliebige geeignete Unterausdrücke e und p.

filter_view modelliert die Konzepte bidirectional_range, forward_range, input_range und common_range, wenn die zugrundeliegende view V die entsprechenden Konzepte modelliert.

Inhalt

[edit] Datenmember

Mitglied Beschreibung
V base_ (private) die zugrunde liegende Ansicht
((exposition-only member object*)
copyable-box<Pred>(bis C++23)movable-box<Pred>(seit C++23) pred_ (private) verpackt das Prädikat, das zum Filtern von Elementen von base_ verwendet wird
((exposition-only member object*)
non-propagating-cache<ranges::iterator_t<V>> begin_ (private)
(nur vorhanden, wenn V forward_range erfüllt)
ein Objekt, das einen Iterator zum ersten Element von base_ zwischenspeichert, das pred_ erfüllt
((exposition-only member object*)

[edit] Member-Funktionen

konstruiert eine filter_view
(öffentliche Memberfunktion)
gibt die zugrunde liegende Ansicht V zurück
(öffentliche Memberfunktion)
gibt eine Referenz auf das in filter_view gespeicherte Prädikat zurück
(öffentliche Memberfunktion)
gibt den Anfangs-Iterator der filter_view zurück
(öffentliche Memberfunktion)
gibt das Sentinel der filter_view zurück
(öffentliche Memberfunktion)
Geerbt von std::ranges::view_interface
gibt zurück, ob die abgeleitete Ansicht leer ist, bereitgestellt nur, wenn sie sized_range oder forward_range erfüllt
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
gibt zurück, ob die abgeleitete Ansicht nicht leer ist, bereitgestellt nur, wenn ranges::empty darauf anwendbar ist
(public member function of std::ranges::view_interface<D>) [edit]
gibt das erste Element in der abgeleiteten View zurück, bereitgestellt, wenn sie forward_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]
gibt das letzte Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie bidirectional_range und common_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]

std::ranges::filter_view::filter_view

filter_view() requires std::default_initializable<V> &&
                       std::default_initializable<Pred> = default;
(1) (seit C++20)
constexpr explicit filter_view( V base, Pred pred );
(2) (seit C++20)
1) Wertinitialisiert base_ über seinen Standard-Member-Initialisierer (= V()) und initialisiert pred_ standardmäßig (was das enthaltene Pred wertinitialisiert).
2) Initialisiert base_ mit std::move(base) und initialisiert pred_ mit std::move(pred).

Parameter

base - zu filternde Range
pred - zu filterndes Prädikat

std::ranges::filter_view::base

constexpr V base() const& requires std::copy_constructible<V>;
(1) (seit C++20)
constexpr V base() &&;
(2) (seit C++20)
1) Äquivalent zu return base_;.
2) Äquivalent zu return std::move(base_);.

std::ranges::filter_view::pred

constexpr const Pred& pred() const;
(seit C++20)

Gibt eine Referenz auf das enthaltene Pred-Objekt zurück. Das Verhalten ist undefiniert, wenn pred_ keinen Wert enthält.

std::ranges::filter_view::begin

constexpr /*iterator*/ begin();
(nur Exposition*)

Um die für das range-Konzept erforderliche amortisierte konstante Zeit zu bieten, speichert diese Funktion das Ergebnis im filter_view-Objekt für nachfolgende Aufrufe. Äquivalent zu

if constexpr (!ranges::forward_range<V>)
    return /*iterator*/{*this, ranges::find_if(base_, std::ref(*pred_))};
else
{
    if (!begin_.has_value())
        begin_ = ranges::find_if(base_, std::ref(*pred_)); // caching
    return /*iterator*/{*this, begin_.value())};
}

Das Verhalten ist undefiniert, wenn pred_ keinen Wert enthält.

std::ranges::filter_view::end

constexpr auto end();
(seit C++20)

Gibt einen Iterator zum Ende zurück. Äquivalent zu

if constexpr (ranges::common_range<V>)
    return /*iterator*/{*this, ranges::end(base_)};
else
    return /*sentinel*/{*this};

[edit] Deduktionshilfen

template< class R, class Pred >
filter_view( R&&, Pred ) -> filter_view<views::all_t<R>, Pred>;
(seit C++20)

[edit] Verschachtelte Klassen

der Iteratortyp von filter_view
((nur zur Veranschaulichung)*)
der Sentinel-Typ von filter_view, wenn die zugrundeliegende View keine common_range ist
((nur zur Veranschaulichung)*)

[edit] Beispiel

#include <iostream>
#include <ranges>
 
int main()
{
    auto even = [](int i) { return 0 == i % 2; };
    auto square = [](int i) { return i * i; };
 
    for (int i : std::views::iota(0, 6)
               | std::views::filter(even)
               | std::views::transform(square))
        std::cout << i << ' ';
    std::cout << '\n';
}

Ausgabe

0 4 16

[edit] Defect Reports

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 3714
(P2711R1)
C++20 der Multi-Parameter-Konstruktor war nicht explizit explizit gemacht
P2325R3 C++20 wenn Pred nicht default_initializable ist, der Standardkonstruktor
konstruiert eine filter_view, die kein Pred enthält
die filter_view ist ebenfalls
nicht default_initializable

[edit] Siehe auch

ein view, der aus den anfänglichen Elementen eines anderen view besteht, bis zum ersten Element, für das ein Prädikat false zurückgibt
(Klassen-Template) (Range-Adaptor-Objekt)[edit]