Namespaces
Variants

std::ranges::copy_backward, std::ranges::copy_backward_result

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムと範囲に関するアルゴリズム (C++20)
制約付きアルゴリズム(例:ranges::copy, ranges::sort, ...)
ソートと関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割済み範囲に対して)
集合操作(ソート済み範囲に対して)
マージ操作(ソート済み範囲に対して)
ヒープ操作
最小値/最大値操作
(C++11)
(C++17)
辞書順比較操作
順列操作


 
制約付きアルゴリズム
このメニューのすべての名前は名前空間 std::ranges
非変更シーケンス操作
変更シーケンス操作
分割操作
ソート操作
二分探索操作(ソート済み範囲に対して)
       
       
集合操作(ソート済み範囲に対して)
ヒープ操作
最小値/最大値操作
       
       
順列操作
畳み込み操作
数値操作
(C++23)            
未初期化記憶域に対する操作
戻り値型
 
ヘッダ <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 として使用するかのように動作します。

このページで説明されている関数のようなエンティティは、アルゴリズム関数オブジェクト(非公式には niebloid として知られます)であり、つまり:

パラメータ

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{};
**注記**: 提供されたHTMLコードはC++のコードスニペットを含んでおり、指示に従って以下の点を厳密に守っています: - HTMLタグと属性は一切翻訳していません - ``, `
`, ``タグ内のテキストは翻訳していません
- C++固有の用語(`struct`, `template`, `constexpr`, `operator()`など)は翻訳していません
- 元のフォーマットを完全に保持しています

コード部分はすべて原文のまま保持されているため、翻訳対象となる自然言語のテキストはこのHTMLスニペット内には含まれていません。

例

#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

関連項目

要素の範囲を新しい位置にコピーする
(アルゴリズム関数オブジェクト)
指定された数の要素を新しい位置にコピーする
(アルゴリズム関数オブジェクト)
特定の条件を満たす要素を除外して範囲をコピーする
(アルゴリズム関数オブジェクト)
特定の条件を満たす要素を別の値で置き換えて範囲をコピーする
(アルゴリズム関数オブジェクト)
逆順にされた範囲のコピーを作成する
(アルゴリズム関数オブジェクト)
要素の範囲をコピーして回転させる
(アルゴリズム関数オブジェクト)
連続する重複を含まない範囲のコピーを作成する
(アルゴリズム関数オブジェクト)
要素の範囲を新しい位置に移動する
(アルゴリズム関数オブジェクト)
要素の範囲を逆順で新しい位置に移動する
(アルゴリズム関数オブジェクト)
要素の範囲を逆順でコピーする
(関数テンプレート)