@specsoftdev live:.cid.8e17e9b93cabb607 specsoftdev@gmail.com
std::ranges::copy_backward
Актуально для C++26.

#include <algorithm>
Актуально на 2025-06-30.


Define overload #1
template<bidirectional_iterator I1, sentinel_for<I1> S1,
         bidirectional_iterator I2>
requires indirectly_copyable<I1, I2>
constexpr ranges::copy_backward_result<I1, I2>
    copy_backward(I1 first, S1 last, I2 result);

Копирует элементы из диапазона [first, last] начиная с last в result.

Example, possible implementation
Define overload #2
template<bidirectional_range R, bidirectional_iterator I>
requires indirectly_copyable<iterator_t<R>, I>
constexpr ranges::copy_backward_result<borrowed_iterator_t<R>, I>
    copy_backward(R&& r, I result);

Копирует элементы из конца диапазона r в result.
Example, possible implementation



Параметры

first, last - пара iterator-sentinel указывающих на копируемый диапазон;
r - объект, инкапсулирующий копируемые данные, удовлетворяющий требования концепта bidirectional_range.
result - объект-итератор, удовлетворяющий требования концепта bidirectional_iterator, указывающий на конец результирующего диапазона. Во избежание возможного переполнения буфера, пользователь должен позаботиться о том, чтобы памяти на которую ссылается result, хватило для записи всех элементов.



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

Вернёт два итератора {last, result - n}, где n, кол-во элементов в диапазоне.



Examples


Example 1:
#include <iostream>
#include <algorithm>
#include <vector>

namespace ranges = std::ranges;

int main()
{
    constexpr char buf[] = {'z','x','c'};
    std::vector<char> result(5, '-');
    auto [_, out] = ranges::copy_backward(buf, std::end(result));

    for (auto c : result)
        std::cout << c;
    std::cout << std::endl;

    for (std::size_t i = 0; i < sizeof(buf); i++)
        std::cout << out[i];
    std::cout << std::endl;
}



--zxc
zxc





Changelog

C++20
Введён в стандарт.


See also

TODO

This page was last modified on 2025-06-30