Namespaces
Variants

std::ranges::move, std::ranges::move_result

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

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


 
制約付きアルゴリズム
このメニュー内のすべての名前は名前空間 std::ranges
に属します
(C++23)
unique_copy
stable_partition
partial_sort_copy
equal_range
set_symmetric_difference
pop_heap
clamp
prev_permutation
fold_left_first  
fold_right
fold_right_last  
fold_left_with_iter
fold_left_first_with_iter
(C++23)
iota            
(C++23)
generate_random
(C++26)
uninitialized_value_construct_n
 
(C++23)<algorithm>
ヘッダ
template< std::input_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O >
requires std::indirectly_movable<I, O>
constexpr move_result<I, O>
    move( I first, S last, O result );
で定義 呼び出しシグネチャ
template< ranges::input_range R, std::weakly_incrementable O >
requires std::indirectly_movable<ranges::iterator_t<R>, O>
constexpr move_result<ranges::borrowed_iterator_t<R>, O>
    move( R&& r, O result );
(1) (C++20 以降)
(2)
template< class I, class O >
using move_result = ranges::in_out_result<I, O>;
(C++20 以降) ヘルパー型
(3) (C++20 以降)[first, last)1)result result で定義された範囲内の要素を、[first, last) から始まる別の範囲にムーブします。 が範囲
内にある場合、動作は未定義です。そのような場合には、代わりに ranges::move_backward を使用できます。2)r (1) と同じですが、ranges::begin(r) をソース範囲として使用し、あたかも first を ranges::end(r) として、last を

として使用するかのように動作します。ムーブ元の範囲の要素は、適切な型の有効な値を保持し続けますが、ムーブ前と同じ値であるとは限りません。

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

パラメータ

first, last - 移動する要素の 範囲 を定義するイテレータ-センチネルペア
r - 移動する要素の範囲
result - 宛先範囲の先頭

戻り値

{ last, result + N } ここで、

1) N = ranges:: distance ( first, last ) .
2) N = ranges:: distance ( r ) .

計算量

正確に N 回のムーブ代入。

注記

重複する範囲を移動する際、 ranges::move は左方向への移動(コピー先範囲の先頭がコピー元範囲の外側にある場合)に適しており、 ranges::move_backward は右方向への移動(コピー先範囲の終端がコピー元範囲の外側にある場合)に適しています。

実装例

struct move_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O>
    requires std::indirectly_movable<I, O>
    constexpr ranges::move_result<I, O>
        operator()(I first, S last, O result) const
    {
        for (; first != last; ++first, ++result)
            *result = ranges::iter_move(first);
        return {std::move(first), std::move(result)};
    }
    template<ranges::input_range R, std::weakly_incrementable O>
    requires std::indirectly_movable<ranges::iterator_t<R>, O>
    constexpr ranges::move_result<ranges::borrowed_iterator_t<R>, O>
        operator()(R&& r, O result) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(result));
    }
};
inline constexpr move_fn move {};

例

以下のコードは、スレッドオブジェクト(それ自体が コピー不可 )をあるコンテナから別のコンテナに移動します。

#include <algorithm>
#include <chrono>
#include <iostream>
#include <iterator>
#include <list>
#include <thread>
#include <vector>
using namespace std::literals::chrono_literals;
void f(std::chrono::milliseconds n)
{
    std::this_thread::sleep_for(n);
    std::cout << "thread with n=" << n.count() << "ms ended" << std::endl;
}
int main()
{
    std::vector<std::jthread> v;
    v.emplace_back(f, 400ms);
    v.emplace_back(f, 600ms);
    v.emplace_back(f, 800ms);
    std::list<std::jthread> l;
    // std::ranges::copy() would not compile, because std::jthread is non-copyable
    std::ranges::move(v, std::back_inserter(l));
}

出力:

thread with n=400ms ended
thread with n=600ms ended
thread with n=800ms ended

関連項目

要素の範囲を逆順に新しい位置へ移動する
(アルゴリズム関数オブジェクト)
要素の範囲を新しい位置へコピーする
(アルゴリズム関数オブジェクト)
要素の範囲を逆順にコピーする
(アルゴリズム関数オブジェクト)
(C++11)
要素の範囲を新しい位置へ移動する
(関数テンプレート)
(C++11)
引数をxvalueに変換する
(関数テンプレート)