名前空間
変種
操作

std::move_backward

From cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとRangeアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
実行ポリシー (C++17)
シーケンスを変更しない操作
一括操作
(C++17)
検索操作
(C++11)                (C++11)(C++11)

シーケンスを変更する操作
コピー操作
(C++11)
(C++11)
move_backward
(C++11)
スワップ操作
変換操作
生成操作
削除操作
順序変更操作
(C++17まで)(C++11)
(C++20)(C++20)
サンプリング操作
(C++17)

ソートおよび関連操作
パーティション操作
ソート操作
二分探索操作
(パーティション化された範囲)
集合操作 (ソート済み範囲)
マージ操作 (ソート済み範囲)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作
Cライブラリ
数値演算
未初期化メモリに対する操作
 
ヘッダー <algorithm> で定義
template< class BidirIt1, class BidirIt2 >
BidirIt2 move_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last );
(C++11以降)
(C++20 以降 constexpr)

範囲 [firstlast) の要素を、d_last で終わる別の範囲に移動します。要素は逆順(最後の要素が最初に移動される)に移動されますが、それらの相対的な順序は保持されます。

d_last(firstlast] の範囲内にある場合、動作は未定義です。この場合、代わりに std::move を使用できます。

目次

[編集] パラメータ

first, last - 移動する要素のソース範囲を定義するイテレータのペア
d_last - 移動先範囲の終わり
型要件
-
BidirIt1, BidirIt2LegacyBidirectionalIterator の要件を満たす必要があります。

[編集] 戻り値

移動された最後の要素を指す、移動先範囲のイテレータ。

[編集] 計算量

正確に std::distance(first, last) 回のムーブ代入。

[編集] 可能な実装

template<class BidirIt1, class BidirIt2>
BidirIt2 move_backward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last)
{
    while (first != last)
        *(--d_last) = std::move(*(--last));
 
    return d_last;
}

[編集] 備考

重複する範囲を移動する場合、std::move は左に移動する場合(移動先範囲の開始がソース範囲の外にある場合)に適しており、std::move_backward は右に移動する場合(移動先範囲の終了がソース範囲の外にある場合)に適しています。

[編集]

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <string_view>
#include <vector>
 
using container = std::vector<std::string>;
 
void print(std::string_view comment, const container& src, const container& dst = {})
{
    auto prn = [](std::string_view name, const container& cont)
    {
        std::cout << name;
        for (const auto &s : cont)
            std::cout << (s.empty() ? "∙" : s.data()) << ' ';
        std::cout << '\n';
    };
    std::cout << comment << '\n';
    prn("src: ", src);
    if (dst.empty())
        return;
    prn("dst: ", dst);
}
 
int main()
{
    container src{"foo", "bar", "baz"};
    container dst{"qux", "quux", "quuz", "corge"};
    print("Non-overlapping case; before move_backward:", src, dst);
    std::move_backward(src.begin(), src.end(), dst.end());
    print("After:", src, dst);
 
    src = {"snap", "crackle", "pop", "lock", "drop"};
    print("Overlapping case; before move_backward:", src);
    std::move_backward(src.begin(), std::next(src.begin(), 3), src.end());
    print("After:", src);
}

出力

Non-overlapping case; before move_backward:
src: foo bar baz
dst: qux quux quuz corge
After:
src: ∙ ∙ ∙
dst: qux foo bar baz
Overlapping case; before move_backward:
src: snap crackle pop lock drop
After:
src: ∙ ∙ snap crackle pop

[編集] 関連項目

(C++11)
要素の範囲を新しい場所にムーブする
(関数テンプレート) [編集]
要素の範囲を逆順で新しい場所にムーブする
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)