Namespaces
Variants

std::ranges::copy_n, std::ranges::copy_n_result

Из 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









 
Ограниченные алгоритмы
Все имена в этом меню принадлежат пространству имён std::ranges
Операции последовательностей без изменения
Операции изменения последовательностей
Операции разделения
Операции сортировки
Операции бинарного поиска (по отсортированным диапазонам)
       
       
Операции над множествами (по отсортированным диапазонам)
Операции с кучей
Операции минимума/максимума
       
       
Операции перестановки
Операции свертки
Операции над неинициализированной памятью
Типы возврата
 
Определён в заголовке <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)
1) Копирует ровно 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{};
**Примечание:** Весь код C++ внутри тегов `
` и `` оставлен без изменений, как и требовалось. 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++11)
копирует указанное количество элементов в новое местоположение
(шаблон функции)