Namespaces
Variants

std::ranges::views::join, std::ranges::join_view

Von de.cppreference.net
 
 
Bereichsbibliothek
Bereichs-Adaptoren
 
 
Definiert in Header <ranges>
template< ranges::input_range V >
    requires ranges::view<V> and
             ranges::input_range<ranges::range_reference_t<V>>
class join_view
    : public ranges::view_interface<join_view<V>>
(1) (seit C++20)
namespace views {
    inline constexpr /* unspecified */ join = /* unspecified */;
}
(2) (seit C++20)
Aufrufsignatur
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto join( R&& r );
(seit C++20)
1) Ein Bereichs-Adapter, der eine view darstellt, die aus der durch Abflachen einer Ansicht von Bereichen erhaltenen Sequenz besteht.
2) RangeAdaptorObject (und auch RangeAdaptorClosureObject). Der Ausdruck views::join(e) ist ausdrucksäquivalent zu join_view<views::all_t<decltype((e))>>{e} für alle geeigneten Unterausdrücke e.

join_view modelliert input_range.

join_view modelliert forward_range, wenn:

  • ranges::range_reference_t<V> ein Referenztyp ist, und
  • V und ranges::range_reference_t<V> jeweils forward_range modellieren.

join_view modelliert bidirectional_range, wenn:

join_view modelliert common_range, wenn:

  • ranges::range_reference_t<V> ein Referenztyp ist, und
  • V und ranges::range_reference_t<V> jeweils forward_range und common_range modellieren.

Memberfunktionen

konstruiert einen join_view
(öffentliche Elementfunktion)
gibt eine Kopie der zugrunde liegenden (angepassten) Ansicht zurück
(öffentliche Elementfunktion)
gibt einen Iterator zum Anfang zurück
(öffentliche Elementfunktion)
gibt einen Iterator oder einen Sentinel zum Ende zurück
(öffentliche Elementfunktion)
Von ranges::view_interface
gibt zurück, ob die abgeleitete Ansicht leer ist, nur verfügbar, wenn sie sized_range oder forward_range
erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
(C++23)
gibt einen konstanten Iterator zum Beginn des Bereichs zurück
(öffentliche Elementfunktion von std::ranges::view_interface<D>)
(C++23)
gibt eine Sentinel für den konstanten Iterator des Bereichs zurück
(öffentliche Elementfunktion von std::ranges::view_interface<D>)
gibt zurück, ob die abgeleitete Ansicht nicht leer ist, nur verfügbar, wenn ranges::empty darauf anwendbar ist
(öffentliche Elementfunktion von std::ranges::view_interface<D>)
gibt das erste Element in der abgeleiteten Ansicht zurück, verfügbar, wenn sie forward_range
erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
gibt das letzte Element in der abgeleiteten Ansicht zurück, nur verfügbar, wenn sie bidirectional_range und common_range
erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)

Ableitungsleitfäden

Geschachtelte Klassen

der Iteratortyp
( Nur zur Darstellung verwendete Member-Klassentemplate* )
der Sentry-Typ
( Nur zur Darstellung verwendete Member-Klassentemplate* )

Hinweise

Vor der Annahme von P2328R1 konnte der innere Bereichstyp ( ranges:: range_reference_t < V > ) kein Containertyp sein (konnte jedoch eine Referenz auf einen Container sein). Beispielsweise war es nicht erlaubt, eine transform_view von std::string -Prvalue zu verknüpfen.

struct Person { int age; std::string name; };
auto f(std::vector<Person>& v) {
//  return v | std::views::transform([](auto& p){ return p.name; })
//           | std::views::join; // Fehler vor P2328R1
    return v | std::views::transform([](auto& p) -> std::string& { return p.name; })
             | std::views::join; // OK
}
**Änderungen:** - "error before P2328R1" → "Fehler vor P2328R1" - "OK" bleibt unverändert (ist ein international gebräuchlicher Begriff in der Programmierung) Alle HTML-Tags, Attribute, C++-Code und spezifische C++-Begriffe wurden beibehalten.

Beispiel

#include <iostream>
#include <ranges>
#include <string_view>
#include <vector>
int main()
{
    using namespace std::literals;
    const auto bits = {"https:"sv, "//"sv, "cppreference"sv, "."sv, "com"sv};
    for (char const c : bits | std::views::join)
        std::cout << c;
    std::cout << '\n';
    const std::vector<std::vector<int>> v{{1, 2}, {3, 4, 5}, {6}, {7, 8, 9}};
    auto jv = std::ranges::join_view(v);
    for (int const e : jv)
        std::cout << e << ' ';
    std::cout << '\n';
}

Ausgabe:

https://de.cppreference.net
1 2 3 4 5 6 7 8 9

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 3474 C++20 views :: join ( e ) gab eine Kopie von e zurück, wenn e ein join_view ist gibt einen verschachtelten join_view zurück
P2328R1 C++20 Nicht-View range Prvalues konnten nicht durch join_view gejoint werden joinfähig gemacht

Siehe auch

eine view bestehend aus der Sequenz, die durch Glätten einer Ansicht von Bereichen mit Trennzeichen zwischen Elementen erhalten wird
(Klassentemplate) (Range-Adapter-Objekt)
eine view bestehend aus der Verkettung der angepassten Ansichten
(Klassentemplate) (Anpassungspunkt-Objekt)