◐ Shell
clean mode source ↗

std::ranges::fill - cppreference.com

De cppreference.com

Definido en el archivo de encabezado <algorithm>

Signatura de la llamada

template< class T, std::output_iterator<const T&> O, std::sentinel_for<O> S > constexpr O fill( O first, S last, const T& value );

(1) (desde C++20)

template< class T, ranges::output_range<const T&> R > constexpr ranges::borrowed_iterator_t<R> fill( R&& r, const T& value );

(2) (desde C++20)

1) Asigna el valor value dado a los elementos en el rango [firstlast).

2) Igual que (1), pero usa r como el rango fuente, como si usara ranges::begin(r) como first y ranges::end(r) como last.

Las entidades similares a funciones descritas en esta página son niebloids, es decir:

En la práctica, pueden implementarse como objetos función o con extensiones de compilador especiales.

Parámetros

first, last - El rango de los elementos a modificar.
r - El rango de los elementos a modificar.
value - El valor a asignar.

Valor de retorno

Un iterador de salida que se compara igual que last.

Complejidad

Exactamente last - first asignaciones.

Posible implementación

struct fill_fn
{
    template<class T, std::output_iterator<const T&> O, std::sentinel_for<O> S>
    constexpr O operator()(O first, S last, const T& value) const
    {
        while (first != last)
            *first++ = value;

        return first;
    }

    template<class T, ranges::output_range<const T&> R>
    constexpr ranges::borrowed_iterator_t<R> operator()(R&& r, const T& value) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), value);
    }
};

inline constexpr fill_fn fill;

Ejemplo

El siguiente código usa ranges::fill para establecer todos los elementos de std::vector<int> primero en -1, luego en 10.

#include <algorithm>
#include <iostream>
#include <vector>

void println(std::vector<int> const& vi)
{
    for (int e : vi)
        std::cout << e << ' ';
    std::cout << '\n';
}

int main()
{
    std::vector<int> v {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    std::ranges::fill(v.begin(), v.end(), -1);
    println(v);

    std::ranges::fill(v, 10);
    println(v);
}

Salida:

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
10 10 10 10 10 10 10 10 10 10

Véase también