Spec-Zone.ru › C++

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)
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.
-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 местоположение первого элемента, следующего за заполненным диапазоном, не возвращалось возвращалось

См. также

fill
копирует заданное значение в каждый элемент в диапазоне
(функция-шаблон)
ranges::fill_n
(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

Spec-Zone.ru

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