Spec-Zone.ru › C++

std::fill_n

Определён в заголовке <algorithm>
template< class OutputIt, class Size, class T >
OutputIt fill_n( OutputIt first, Size count, const T& value );
(1) (до C++26)
(constexpr начиная с C++20)
template< class OutputIt, class Size,
          class T = typename std::iterator_traits
                        <OutputIt>::value_type >
constexpr OutputIt fill_n( OutputIt first, Size count,
                           const T& value );
(начиная с C++26)
template< class ExecutionPolicy,
          class ForwardIt, class Size, class T >
ForwardIt fill_n( ExecutionPolicy&& policy,
                  ForwardIt first, Size count, const T& value );
(2) (начиная с C++17)
(до C++26)
template< class ExecutionPolicy,
          class ForwardIt, class Size,
          class T = typename std::iterator_traits
                        <OutputIt>::value_type >
ForwardIt fill_n( ExecutionPolicy&& policy,
                  ForwardIt first, Size count, const T& value );
(начиная с C++26)
1) Присваивает заданное значение value первым count элементам диапазона, начинающегося с first, если count > 0. В противном случае ничего не делает.
2) То же, что и (1), но выполняется в соответствии с policy.
Эта перегрузка участвует в разрешении перегрузки, только если значение следующего выражения равно true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(до C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(начиная с C++20)

Если выполняется хотя бы одно из следующих условий, программа некорректна:

  • value не является доступным для записи в first.
  • Size не является преобразуемым в целочисленный тип.

Параметры

first - начало диапазона элементов для изменения
count - количество элементов для изменения
value - присваиваемое значение
policy - используемая политика выполнения
Требования к типам
-OutputIt должен соответствовать требованиям LegacyOutputIterator.
-ForwardIt должен соответствовать требованиям LegacyForwardIterator.

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

Итератор, указывающий на элемент, следующий за последним присвоенным, если count > 0, иначе — first.

Сложность

Ровно std::max(0, count) операций присваивания.

Исключения

Перегрузка с параметром шаблона с именем ExecutionPolicy сообщает об ошибках следующим образом:

  • Если выполнение функции, вызванной в рамках алгоритма, выбрасывает исключение и ExecutionPolicy является одной из стандартных политик, вызывается std::terminate. Для любого другого ExecutionPolicy поведение определяется реализацией.
  • Если алгоритму не удаётся выделить память, выбрасывается std::bad_alloc.

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

fill_n
template<class OutputIt, class Size,
         class T = typename std::iterator_traits<OutputIt>::value_type>
OutputIt fill_n(OutputIt first, Size count, const T& value)
{
    for (Size i = 0; i < count; i++)
        *first++ = value;
    return first;
}

Примечания

Макрос проверки поддержки функции Значение Стандарт Функция
__cpp_lib_algorithm_default_value_type 202403 (C++26) Инициализация списком для алгоритмов (1,2)

Пример

#include <algorithm>
#include <complex>
#include <iostream>
#include <iterator>
#include <vector>

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

    // replace values of the first 5 elements with -1
    std::fill_n(v1.begin(), 5, -1);

    std::copy_n(v1.cbegin(), v1.size(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';

    std::vector<std::complex<double>> nums{{1, 3}, {2, 2}, {4, 8}};
    #ifdef __cpp_lib_algorithm_default_value_type
        std::fill_n(nums.begin(), 2, {4, 2});
    #else
        std::fill_n(nums.begin(), 2, std::complex<double>{4, 2});
    #endif
    std::copy_n(nums.cbegin(), nums.size(),
                std::ostream_iterator<std::complex<double>>(std::cout, " "));
    std::cout << '\n';
}

Вывод:

-1 -1 -1 -1 -1 5 6 7 8 9
(4,2) (4,2) (4,8)

Отчёты об исправлении дефектов

Следующие отчёты об исправлении дефектов, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применено к Опубликованное поведение Корректное поведение
LWG 283 C++98 T требовалось быть CopyAssignable, но
T не всегда доступен для записи в OutputIt
вместо этого требовалось быть доступным для записи
LWG 426 C++98 требование к сложности было «ровно count
операций присваивания», что некорректно, если count отрицательно
присваивание не выполняется, если
count неположительно
LWG 865 C++98 не возвращалось расположение первого элемента
после заполняемого диапазона
возвращается

См. также

fill
копирующим присваиванием присваивает заданное значение каждому элементу диапазона
(шаблон функции и функциональный объект алгоритма)
ranges::fill
(C++20)
ranges::fill_n
(C++20)
присваивает значение заданному количеству элементов
(функциональный объект алгоритма)

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

Spec-Zone.ru

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