Spec-Zone.ru › C++

std::ranges::fill

Defined in header <algorithm>
Call signature
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) (since C++20)
template< class T, ranges::output_range<const T&> R >
constexpr ranges::borrowed_iterator_t<R>
    fill( R&& r, const T& value );
(2) (since C++20)
1) Присваивает заданное value элементам в диапазоне [first, last).
2) Аналогично (1), но использует r в качестве исходного диапазона, как если бы ranges::begin(r) использовался в качестве first и ranges::end(r) как last.

Функциональные сущности, описанные на этой странице, являются niebloids, то есть:

  • Явные списки шаблонов аргументов не могут быть указаны при вызове любого из них.
  • Ни один из них не виден для поиска зависимых от аргументов.
  • Когда любой из них найден обычным поиском без квалификаторов как имя слева от оператора вызова функции, поиск зависимых от аргументов запрещён.

На практике они могут быть реализованы как объекты функций или с использованием специальных расширений компилятора.

Параметры

first, last - диапазон элементов для изменения
r - диапазон элементов для изменения
value - значение, которое должно быть присвоено

Возвращаемое значение

Итератор вывода, равный last.

Сложность

Ровно last - first присваиваний.

Возможная реализация

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;

Пример

Следующий код использует ranges::fill для установки всех элементов std::vector<int> first в -1, а затем в 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);
}

Вывод:

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

См. также

ranges::fill_n
(C++20)
присваивает значение определенному количеству элементов
(niebloid)
ranges::copyranges::copy_if
(C++20)(C++20)
копирует диапазон элементов в новое место
(niebloid)
ranges::generate
(C++20)
сохраняет результат функции в диапазоне
(niebloid)
ranges::transform
(C++20)
применяет функцию к диапазону элементов
(niebloid)
fill
присваивает заданное значение каждому элементу в диапазоне
(функция-шаблон)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/ranges/fill

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API