Namespaces
Variants

std::ranges::copy_backward, std::ranges::copy_backward_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::bidirectional_iterator I1, std::sentinel_for<I1> S1,
          std::bidirectional_iterator I2 >
requires std::indirectly_copyable<I1, I2>
constexpr copy_backward_result<I1, I2>
    copy_backward( I1 first, S1 last, I2 d_last );
(1) (начиная с C++20)
template< ranges::bidirectional_range R, std::bidirectional_iterator I >
requires std::indirectly_copyable<ranges::iterator_t<R>, I>
constexpr copy_backward_result<ranges::borrowed_iterator_t<R>, I>
    copy_backward( R&& r, I d_last );
(2) (начиная с C++20)
Вспомогательные типы
template< class I1, class I2 >
using copy_backward_result = ranges::in_out_result<I1, I2>;
(3) (начиная с C++20)
1) Копирует элементы из диапазона, определённого [first, last), в другой диапазон [d_last - N, d_last), где N = ranges::distance(first, last). Элементы копируются в обратном порядке (последний элемент копируется первым), но их относительный порядок сохраняется. Поведение не определено, если d_last находится внутри (first, last]. В таком случае можно использовать std::ranges::copy.
2) То же, что и (1), но использует r в качестве исходного диапазона, как если бы использовался ranges::begin(r) в качестве first, и ranges::end(r) в качестве last.

Функциональные объекты, описанные на этой странице, являются функциональными объектами алгоритмов (неформально известны как niebloids), то есть:

Параметры

first, last - пара итератор-дозор, определяющая диапазон копируемых элементов
r - диапазон копируемых элементов
d_last - конец целевого диапазона

Возвращаемое значение

{last, d_last - N}

Сложность

Ровно N присваиваний.

Примечания

При копировании перекрывающихся диапазонов ranges::copy подходит при копировании влево (начало целевого диапазона находится вне исходного диапазона), в то время как ranges::copy_backward подходит при копировании вправо (конец целевого диапазона находится вне исходного диапазона).

Возможная реализация

struct copy_backward_fn
{
    template<std::bidirectional_iterator I1, std::sentinel_for<I1> S1,
             std::bidirectional_iterator I2>
    requires std::indirectly_copyable<I1, I2>
    constexpr ranges::copy_backward_result<I1, I2>
        operator()(I1 first, S1 last, I2 d_last) const
    {
        I1 last1 {ranges::next(first, std::move(last))};
        for (I1 i {last1}; i != first;)
            *--d_last = *--i;
        return {std::move(last1), std::move(d_last)};
    }

    template<ranges::bidirectional_range R, std::bidirectional_iterator I>
    requires std::indirectly_copyable<ranges::iterator_t<R>, I>
    constexpr ranges::copy_backward_result<ranges::borrowed_iterator_t<R>, I>
        operator()(R&& r, I d_last) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(d_last));
    }
};

inline constexpr copy_backward_fn copy_backward{};

Пример

#include <algorithm>
#include <iostream>
#include <ranges>
#include <string_view>
#include <vector>

void print(std::string_view rem, std::ranges::forward_range auto const& r)
{
    for (std::cout << rem << ": "; auto const& elem : r)
        std::cout << elem << ' ';
    std::cout << '\n';
}

int main()
{
    const auto src = {1, 2, 3, 4};
    print("src", src);

    std::vector<int> dst(src.size() + 2);
    std::ranges::copy_backward(src, dst.end());
    print("dst", dst);

    std::ranges::fill(dst, 0);
    const auto [in, out] =
        std::ranges::copy_backward(src.begin(), src.end() - 2, dst.end());
    print("dst", dst);

    std::cout
        << "(in - src.begin) == " << std::distance(src.begin(), in) << '\n'
        << "(out - dst.begin) == " << std::distance(dst.begin(), out) << '\n';
}

Вывод:

src: 1 2 3 4
dst: 0 0 1 2 3 4
dst: 0 0 0 0 1 2
(in - src.begin) == 2
(out - dst.begin) == 4

Смотри также

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