std::fill_n
Определено в заголовке <algorithm> | ||
|---|---|---|
| (1) | ||
template< class OutputIt, class Size, class T > OutputIt fill_n( OutputIt first, Size count, const T& value ); | (до C++20) | |
template< class OutputIt, class Size, class T > constexpr OutputIt fill_n( OutputIt first, Size count, const T& value ); | (с C++20) | |
template< class ExecutionPolicy, class ForwardIt, class Size, class T >
ForwardIt fill_n( ExecutionPolicy&& policy,
ForwardIt first, Size count, const T& value );
| (2) | (с C++17) |
value первым count элементам в диапазоне, начинающемся с first, если count > 0. В противном случае ничего не делает.policy. Этот перегруз не участвует в разрешении перегрузки, если |
| (до C++20) |
|
| (с C++20) |
Параметры
| first | - | начало диапазона элементов для изменения |
| count | - | количество элементов для изменения |
| value | - | значение, которое нужно присвоить |
| policy | - | политика выполнения. Смотрите политику выполнения для получения подробной информации. |
| Требования к типу | ||
-OutputIt должно удовлетворять требованиям LegacyOutputIterator. |
||
-ForwardIt должно удовлетворять требованиям LegacyForwardIterator. |
||
-value должно быть доступно для записи в first. |
||
-Size должно быть преобразуемо в целочисленный тип. |
||
Возвращаемое значение
Итератор, указывающий на элемент, следующий за последним присвоенным элементом, если count > 0, first в противном случае.
Сложность
Ровно std::max(0, count) присваиваний.
Исключения
Перегрузка с параметром шаблона, названным ExecutionPolicy, сообщает об ошибках следующим образом:
- Если во время выполнения функции, вызванной как часть алгоритма, возникает исключение, и
ExecutionPolicyявляется одной из стандартных политик,std::terminateвызывается. Для любой другойExecutionPolicy, поведение определяется реализацией. - Если алгоритм не может выделить память, выбрасывается
std::bad_alloc.
Возможная реализация
template<class OutputIt, class Size, class T>
OutputIt fill_n(OutputIt first, Size count, const T& value)
{
for (Size i = 0; i < count; i++)
*first++ = value;
return first;
} |
Пример
Следующий код использует fill_n() для присвоения -1 первой половине вектора целых чисел:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> v1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::fill_n(v1.begin(), 5, -1);
std::copy(begin(v1), end(v1), std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
}Вывод:
-1 -1 -1 -1 -1 5 6 7 8 9
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применимо к | Поведение, опубликованное | Правильное поведение |
|---|---|---|---|
| LWG 283 | C++98 |
T должно было быть CopyAssignable, ноT не всегда доступно для записи в OutputIt | должно быть доступно для записи |
| LWG 426 | C++98 | требование к сложности было «ровно countприсваиваний», что нарушается, если count отрицательно | нет присваиваний, еслиcount не положительно |
| LWG 865 | C++98 | местоположение первого элемента, следующего за заполненным диапазоном, не возвращалось | возвращалось |
См. также
| копирует заданное значение в каждый элемент в диапазоне (функция-шаблон) |
|
|
(C++20) | присваивает значение определённому количеству элементов (niebloid) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/fill_n