Namespaces
Variants

std:: move_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
定義先ヘッダ <iterator>
template < class Iter >
class move_iterator ;
(C++11以降)

std::move_iterator は、基盤となるイテレータ(少なくとも LegacyInputIterator または input_iterator をモデル化する (C++20以降) 、またはより強いイテレータコンセプト (C++23以降) )とまったく同じように動作するイテレータアダプタであるが、間接参照時に基盤イテレータが返す値を右辺値に変換する点が異なる。このイテレータが入力イテレータとして使用される場合、値がコピーされるのではなくムーブされる効果がある。

目次

ネスト型

定義
iterator_type Iter
iterator_category std:: iterator_traits < Iter > :: iterator_category
value_type std:: iterator_traits < Iter > :: value_type
difference_type std:: iterator_traits < Iter > :: difference_type
pointer Iter
reference
(C++20まで)
定義
iterator_type Iter
iterator_category
(条件付きで存在)
iterator_concept

std::input_iterator_tag

(C++23まで)
(C++23以降)
value_type std:: iter_value_t < Iter >
difference_type std:: iter_difference_t < Iter >
pointer Iter
reference std:: iter_rvalue_reference_t < Iter >
(C++20以降)

データメンバ

メンバー 説明
Iter current 基盤となるイテレータ
( 説明専用メンバーオブジェクト* )

メンバー関数

新しい move_iterator を構築する
(public member function)
別の move_iterator を代入する
(public member function)
基となるイテレータにアクセスする
(public member function)
指し示す要素にアクセスする
(public member function)
インデックスによる要素へのアクセス
(public member function)
move_iterator を進める、または戻す
(public member function)

非メンバー関数

(C++11) (C++11) (removed in C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
基底となるイテレータを比較する
(関数テンプレート)
基底となるイテレータと基底となるセンチネルを比較する
(関数テンプレート)
(C++11)
イテレータを進める
(関数テンプレート)
(C++11)
2つのイテレータアダプタ間の距離を計算する
(関数テンプレート)
基底となるイテレータと基底となるセンチネル間の距離を計算する
(関数テンプレート)
(C++20)
基底となるイテレータのデリファレンス結果を関連する右辺値参照型にキャストする
(関数)
(C++20)
2つの基底となるイテレータが指すオブジェクトを交換する
(関数テンプレート)
引数から推論された型の std::move_iterator を作成する
(関数テンプレート)

ヘルパーテンプレート

template < class Iterator1, class Iterator2 >

requires ( ! std:: sized_sentinel_for < Iterator1, Iterator2 > )
constexpr bool disable_sized_sentinel_for

< std :: move_iterator < Iterator1 > , std :: move_iterator < Iterator2 >> = true ;
(C++20以降)

std::disable_sized_sentinel_for のこの部分特殊化は、 基盤となるイテレータがコンセプトを満たさない場合に、 move_iterator の特殊化が sized_sentinel_for を満たすことを防止します。

注記

機能テスト マクロ 標準 機能
__cpp_lib_move_iterator_concept 202207L (C++23) std :: move_iterator < T * > をランダムアクセスイテレータにする

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <ranges>
#include <string>
#include <string_view>
#include <vector>
void print(const std::string_view rem, const auto& v)
{
    std::cout << rem;
    for (const auto& s : v)
        std::cout << std::quoted(s) << ' ';
    std::cout << '\n';
};
int main()
{
    std::vector<std::string> v{"this", "_", "is", "_", "an", "_", "example"};
    print("Old contents of the vector: ", v);
    std::string concat;
    for (auto begin = std::make_move_iterator(v.begin()),
              end = std::make_move_iterator(v.end());
         begin != end; ++begin)
    {
        std::string temp{*begin}; // moves the contents of *begin to temp
        concat += temp;
    }
    // Starting from C++17, which introduced class template argument deduction,
    // the constructor of std::move_iterator can be used directly:
    // std::string concat = std::accumulate(std::move_iterator(v.begin()),
    //                                      std::move_iterator(v.end()),
    //                                      std::string());
    print("New contents of the vector: ", v);
    print("Concatenated as string: ", std::ranges::single_view(concat));
}

出力例:

Old contents of the vector: "this" "_" "is" "_" "an" "_" "example"
New contents of the vector: "" "" "" "" "" "" ""
Concatenated as string: "this_is_an_example"

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 2106 C++11 move_iterator の間接参照がダングリング参照を返す可能性があった
基盤となるイテレータの間接参照がprvalueを返す場合
代わりにオブジェクトを
返す
LWG 3736 C++20 move_iterator disable_sized_sentinel_for の特殊化が欠落していた 追加された
P2259R1 C++20 メンバ iterator_category が定義されていた(
std:: iterator_traits < Iter > :: iterator_category が定義されていない場合でも)
この場合 iterator_category
定義されない

関連項目

引数から型が推論される std::move_iterator を作成する
(関数テンプレート)
std::move_iterator のためのセンチネルアダプタ
(クラステンプレート)