std:: move_iterator
|
定義先ヘッダ
<iterator>
|
||
|
template
<
class
Iter
>
class move_iterator ; |
(C++11以降) | |
std::move_iterator
は、基盤となるイテレータ(少なくとも
LegacyInputIterator
または
input_iterator
をモデル化する
(C++20以降)
、またはより強いイテレータコンセプト
(C++23以降)
)とまったく同じように動作するイテレータアダプタであるが、間接参照時に基盤イテレータが返す値を右辺値に変換する点が異なる。このイテレータが入力イテレータとして使用される場合、値がコピーされるのではなくムーブされる効果がある。
目次 |
ネスト型
|
(C++20まで) | ||||||||||||||||||||
|
(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++20)
|
基底となるイテレータと基底となるセンチネルを比較する
(関数テンプレート) |
|
(C++11)
|
イテレータを進める
(関数テンプレート) |
|
(C++11)
|
2つのイテレータアダプタ間の距離を計算する
(関数テンプレート) |
|
(C++20)
|
基底となるイテレータと基底となるセンチネル間の距離を計算する
(関数テンプレート) |
|
(C++20)
|
基底となるイテレータのデリファレンス結果を関連する右辺値参照型にキャストする
(関数) |
|
(C++20)
|
2つの基底となるイテレータが指すオブジェクトを交換する
(関数テンプレート) |
|
(C++11)
|
引数から推論された型の
std::move_iterator
を作成する
(関数テンプレート) |
ヘルパーテンプレート
|
template
<
class
Iterator1,
class
Iterator2
>
requires
(
!
std::
sized_sentinel_for
<
Iterator1, Iterator2
>
)
|
(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
は
定義されない |
関連項目
|
(C++11)
|
引数から型が推論される
std::move_iterator
を作成する
(関数テンプレート) |
|
(C++20)
|
std::move_iterator
のためのセンチネルアダプタ
(クラステンプレート) |