Namespaces
Variants

std:: fill_n

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
fill_n
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Определено в заголовочном файле <algorithm>
(1)
template < class OutputIt, class Size, class T >
OutputIt fill_n ( OutputIt first, Size count, const T & value ) ;
(constexpr начиная с C++20)
(до C++26)
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)
(2)
template < class ExecutionPolicy,

class ForwardIt, class Size, class T >
ForwardIt fill_n ( ExecutionPolicy && policy,

ForwardIt first, Size count, const T & value ) ;
(начиная с 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 .
Эта перегрузка участвует в разрешении перегрузки только при выполнении всех следующих условий:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> равно true .

(до C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> равно true .

(начиная с 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;
}
**Примечание:** В данном случае переводить нечего, так как: - HTML теги и атрибуты не переводятся - Текст внутри `
` тегов (C++ код) не переводится
- Единственный текст для перевода - название функции `fill_n`, но это C++ специфический термин, который не переводится
Весь контент сохранен в оригинальном виде в соответствии с требованиями.

Примечания

Макрос тестирования возможностей Значение Стандарт Функция
__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};
    // заменяем значения первых 5 элементов на -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 позиция первого элемента после
заполняемого диапазона не возвращалась
возвращается

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

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