std::ranges::copy_backward, std::ranges::copy_backward_result
Определён в заголовочном файле <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) | (since 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) | (since C++20) |
| Вспомогательные типы | ||
template< class I1, class I2 > using copy_backward_result = ranges::in_out_result<I1, I2>; | (3) | (since C++20) |
Копирует все элементы из исходного диапазона в диапазон назначения, заканчивающийся на d_last, начиная с конца и продвигаясь к началу (в обратном порядке).
[first, last).r.Функциональные сущности, описанные на этой странице, являются функциональными объектами алгоритмов (неформально называемыми ниеблоидами), то есть:
- При вызове любой из них нельзя указывать явные списки аргументов шаблона.
- Ни одна из них не видна для поиска, зависящего от аргументов.
- Если любая из них найдена с помощью обычного неквалифицированного поиска как имя слева от оператора вызова функции, поиск, зависящий от аргументов, подавляется.
Параметры
| first, last | - | пара итератора и сентинела, задающая исходный диапазон |
| r | - | исходный диапазон |
| d_last | - | итератор за последним элементом диапазона назначения |
Возвращаемое значение
Объект типа ranges::copy_backward_result, в котором:
- Поле данных
inсодержит итератор за последним элементом исходного диапазона. - Поле данных
outсодержит итератор на последний элемент диапазона назначения, которому было присвоено значение при копировании, илиd_last, если ни один элемент не был скопирован.
Сложность
ranges::distance(first, last) присваиваний.ranges::distance(r) присваиваний.Примечания
При копировании перекрывающихся диапазонов для копирования влево (начало диапазона назначения находится за пределами исходного диапазона) подходит 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::next(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, const std::ranges::forward_range auto& r)
{
for (std::cout << rem << ": "; const auto& 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
См. также
| копирует диапазон элементов в обратном порядке (шаблон функции) |
|
|
(C++20)(C++20) | копирует диапазон элементов в новое место (функциональный объект алгоритма) |
|
(C++20) | копирует заданное количество элементов в новое место (функциональный объект алгоритма) |
|
(C++20)(C++20) | копирует диапазон элементов, исключая те, которые удовлетворяют заданным критериям (функциональный объект алгоритма) |
|
(C++20)(C++20) | копирует диапазон, заменяя элементы, удовлетворяющие заданным критериям, другим значением (функциональный объект алгоритма) |
|
(C++20) | создаёт копию диапазона в обратном порядке (функциональный объект алгоритма) |
|
(C++20) | копирует и циклически сдвигает диапазон элементов (функциональный объект алгоритма) |
|
(C++20) | создаёт копию диапазона элементов, не содержащую повторяющихся соседних элементов (функциональный объект алгоритма) |
|
(C++20) | перемещает диапазон элементов в новое место (функциональный объект алгоритма) |
|
(C++20) | перемещает диапазон элементов в новое место в обратном порядке (функциональный объект алгоритма) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/ranges/copy_backward