Namespaces
Variants

std::fill_n

С ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Неизменяющие операции над последовательностями    
Пакетные операции
(C++17)
Операции поиска
Изменяющие операции над последовательностями
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разделения
(C++11)    

Операции сортировки
Операции двоичного поиска
(по разбитым диапазонам)
Операции над множествами (по отсортированным диапазонам)
Операции слияния (по отсортированным диапазонам)
Операции с кучей
Операции минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения (C++17)
(только для пояснения*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









 
Определено в заголовке <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)

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

Параметры

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

Примечания

Макрос тестирования возможностей Значение Std Возможность
__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 местоположение первого элемента после
заполняемого диапазона не возвращалось
возвращается

Смотрите также

копирующее присваивание заданного значения каждому элементу в диапазоне
(шаблон функции & объект функции алгоритма)
присваивает значение нескольким элементам
(объект функции алгоритма)