Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
Definido en el encabezado <ranges>
template < ranges:: input_range V >

requiere ranges:: view < V > y
ranges:: input_range < ranges:: range_reference_t < V >>
class join_view

: public ranges:: view_interface < join_view < V >>
(1) (desde C++20)
namespace views {

inline constexpr /* no especificado */ join = /* no especificado */ ;

}
(2) (desde C++20)
Firma de llamada
template < ranges:: viewable_range R >

requiere /* ver más abajo */

constexpr ranges:: view auto join ( R && r ) ;
(desde C++20)
1) Un adaptador de rango que representa una view que consiste en la secuencia obtenida al aplanar una vista de rangos.
2) RangeAdaptorObject (y también RangeAdaptorClosureObject ). La expresión views :: join ( e ) es equivalente-expresión a join_view < views:: all_t < decltype ( ( e ) ) >> { e } para cualquier subexpresión adecuada e .

join_view modela input_range .

join_view modela forward_range cuando:

join_view modela bidirectional_range cuando:

join_view modela common_range cuando:

Contenidos

Funciones miembro

construye un join_view
(función miembro pública)
devuelve una copia de la vista subyacente (adaptada)
(función miembro pública)
devuelve un iterador al inicio
(función miembro pública)
devuelve un iterador o un centinela al final
(función miembro pública)
Heredado de std::ranges::view_interface
devuelve si la vista derivada está vacía, proporcionado solo si satisface sized_range o forward_range
(función miembro pública de std::ranges::view_interface<D> )
(C++23)
devuelve un iterador constante al inicio del rango
(función miembro pública de std::ranges::view_interface<D> )
(C++23)
devuelve un centinela para el iterador constante del rango
(función miembro pública de std::ranges::view_interface<D> )
devuelve si la vista derivada no está vacía, proporcionado solo si ranges::empty es aplicable a ella
(función miembro pública de std::ranges::view_interface<D> )
devuelve el primer elemento en la vista derivada, proporcionado si satisface forward_range
(función miembro pública de std::ranges::view_interface<D> )
devuelve el último elemento en la vista derivada, proporcionado solo si satisface bidirectional_range y common_range
(función miembro pública de std::ranges::view_interface<D> )

Guías de deducción

Clases anidadas

el tipo de iterador
( clase de plantilla miembro solo para exposición* )
el tipo de centinela
( clase de plantilla miembro solo para exposición* )

Notas

Antes de que P2328R1 fuera adoptado, el tipo de rango interno ( ranges:: range_reference_t < V > ) no podía ser un tipo contenedor (pero sí podía ser referencia a contenedor). Por ejemplo, no estaba permitido unir un transform_view de prvalue de std::string .

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; // error antes de P2328R1
    return v | std::views::transform([](auto& p) -> std::string& { return p.name; })
             | std::views::join; // OK
}

Ejemplo

#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';
}

Salida:

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
LWG 3474 C++20 views :: join ( e ) devolvía una copia de e cuando e es un join_view devuelve un join_view anidado
P2328R1 C++20 los prvalues de range que no son views no podían unirse mediante join_view hecho unificable

Véase también

una view que consiste en la secuencia obtenida al aplanar una vista de rangos, con el delimitador entre elementos
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en la concatenación de las vistas adaptadas
(plantilla de clase) (objeto punto de personalización)