std::ranges::copy_n, std::ranges::copy_n_result
| Определён в заголовке <algorithm>
|
||
| Сигнатура вызова |
||
template< std::input_iterator I, std::weakly_incrementable O >
requires std::indirectly_copyable<I, O>
constexpr copy_n_result<I, O>
copy_n( I first, std::iter_difference_t<I> n, O result );
|
(1) | (начиная с C++20) |
| Вспомогательный тип |
||
template< class I, class O >
using copy_n_result = ranges::in_out_result<I, O>;
|
(2) | (начиная с C++20) |
n значений из диапазона, начинающегося с first в диапазон, начинающийся с result выполняя *(result + i) = *(first + i) для каждого целого числа из [0, n). Поведение не определено, если result находится в диапазоне [first, first + n) (ranges::copy_backward можно использовать вместо этого).Сущности, подобные функциям, описанные на этой странице, являются объектами-функциями алгоритмов (неформально известными как niebloids), а именно:
- Явные списки аргументов шаблона не могут быть указаны при вызове любой из них.
- Ни одна из них не видна для поиска, зависящего от аргументов.
- Когда любая из них найдена обычным неквалифицированным поиском как имя слева от оператора вызова функции, поиск, зависящий от аргументов подавляется.
Параметры
| first | - | начало диапазона элементов для копирования |
| n | - | количество элементов для копирования |
| result | - | начало целевого диапазона |
Возвращаемое значение
ranges
::
copy_n_result
{
first
+
n, result
+
n
}
или, более формально, значение типа
ranges::in_out_result
содержащее
input_iterator
итератор равный
ranges::
next
(
first, n
)
и
weakly_incrementable
итератор равный
ranges::
next
(
result, n
)
.
Сложность
Ровно n присваиваний.
Примечания
На практике реализации
std::ranges::copy_n
могут избегать множественных присваиваний и использовать массовые функции копирования, такие как
std::memmove
, если тип значения является
TriviallyCopyable
и типы итераторов удовлетворяют требованиям
contiguous_iterator
. Альтернативно, такое ускорение копирования может быть внедрено на фазе оптимизации компилятора.
При копировании перекрывающихся диапазонов,
std::ranges::copy_n
следует использовать при копировании влево (начало целевого диапазона находится вне исходного диапазона), тогда как
std::ranges::copy_backward
следует использовать при копировании вправо (конец целевого диапазона находится вне исходного диапазона).
Возможная реализация
struct copy_n_fn { template<std::input_iterator I, std::weakly_incrementable O> requires std::indirectly_copyable<I, O> constexpr ranges::copy_n_result<I, O> operator()(I first, std::iter_difference_t<I> n, O result) const { for (; n-- > 0; (void)++first, (void)++result) *result = *first; return {std::move(first), std::move(result)}; } }; inline constexpr copy_n_fn copy_n{}; |
` и `` оставлен без изменений, как и требовалось. HTML-теги и атрибуты также сохранены в оригинальном виде.
Пример
#include <algorithm> #include <iomanip> #include <iostream> #include <iterator> #include <string> #include <string_view> int main() { const std::string_view in{"ABCDEFGH"}; std::string out; std::ranges::copy_n(in.begin(), 4, std::back_inserter(out)); std::cout << std::quoted(out) << '\n'; out = "abcdefgh"; const auto res{std::ranges::copy_n(in.begin(), 5, out.begin())}; const auto i{std::distance(std::begin(in), res.in)}; const auto j{std::distance(std::begin(out), res.out)}; std::cout << "in[" << i << "] = '" << in[i] << "'\n" << "out[" << j << "] = '" << out[j] << "'\n"; }
Вывод:
"ABCD" in[5] = 'F' out[5] = 'f'
Смотрите также
|
(C++20)
(C++20)
|
копирует диапазон элементов в новое местоположение
(объект-функция алгоритма) |
|
(C++20)
|
копирует диапазон элементов в обратном порядке
(объект-функция алгоритма) |
|
(C++20)
(C++20)
|
копирует диапазон элементов, пропуская те, которые удовлетворяют определенным критериям
(объект-функция алгоритма) |
|
(C++20)
(C++20)
|
копирует диапазон, заменяя элементы, удовлетворяющие определенным критериям, другим значением
(объект-функция алгоритма) |
|
(C++20)
|
создает копию диапазона в обратном порядке
(объект-функция алгоритма) |
|
(C++20)
|
копирует и вращает диапазон элементов
(объект-функция алгоритма) |
|
(C++20)
|
создает копию диапазона элементов, не содержащую последовательных дубликатов
(объект-функция алгоритма) |
|
(C++20)
|
перемещает диапазон элементов в новое местоположение
(объект-функция алгоритма) |
|
(C++20)
|
перемещает диапазон элементов в новое местоположение в обратном порядке
(объект-функция алгоритма) |
|
(C++11)
|
копирует указанное количество элементов в новое местоположение
(шаблон функции) |