namespace std {
template <class Iterator>
class move_iterator;
}
概要
move_iterator
は、イテレータをラップし、間接参照時に参照先の要素をムーブするイテレータアダプタである。その他の操作は、元のイテレータそのものの動作をする。
要件
move_iterator
クラスのテンプレートパラメータIterator
は、入力イテレータの要件を満たすかinput_iterator
のモデルであること。
さらに、双方向またはランダムアクセスの横断を必要とする操作を行う場合は、それぞれ双方向イテレータまたはランダムアクセスイテレータの要件を満たすか、それぞれbidirectional_iterator
またはrandom_access_iterator
のモデルであること。
メンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
(constructor) |
コンストラクタ | C++11 |
~move_iterator() = default |
デストラクタ | C++11 |
operator= |
代入演算子 | C++11 |
base |
元のイテレータを取得する | C++11 |
operator* |
間接参照演算子 | C++11 |
operator-> |
メンバアクセス演算子 | C++11 |
operator++ |
イテレータをインクリメントする | C++11 |
operator-- |
イテレータをデクリメントする | C++11 |
operator+ |
イテレータを進める | C++11 |
operator+= |
イテレータ自身を進める | C++11 |
operator- |
イテレータを逆に進める | C++11 |
operator-= |
イテレータ自身を逆に進める | C++11 |
operator[] |
任意の位置にランダムアクセスする | C++11 |
メンバ型
C++17まで
名前 | 説明 | 対応バージョン |
---|---|---|
iterator_type |
Iterator |
C++11 |
difference_type |
iterator_traits<Iterator>::difference_type |
C++11 |
pointer |
Iterator |
C++11 |
value_type |
iterator_traits<Iterator>::value_type |
C++11 |
iterator_category |
iterator_traits<Iterator>::iterator_category |
C++11 |
reference |
value_type&& |
C++11 |
C++20
名前 | 説明 | 対応バージョン |
---|---|---|
iterator_type |
Iterator |
C++11 |
difference_type |
iter_difference_t<Iterator> |
C++20 |
pointer |
Iterator |
C++11 |
value_type |
iter_value_t<Iterator> |
C++20 |
iterator_category |
iterator_traits<Iterator>::iterator_category ただし、 contiguous_iterator_tag となるときはrandom_access_iterator_tag |
C++20 |
iterator_concept |
input_iterator_tag |
C++20 |
reference |
iter_rvalue_reference_t<Iterator> |
C++20 |
非メンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
operator== |
等値比較 | C++11 |
operator!= |
非等値比較 | C++11 |
operator< |
左辺が右辺より小さいかの判定を行う | C++11 |
operator<= |
左辺が右辺以下かの判定を行う | C++11 |
operator> |
左辺が右辺より大きいかの判定を行う | C++11 |
operator>= |
左辺が右辺以上かの判定を行う | C++11 |
operator<=> |
三方比較を行う | C++20 |
operator- |
2つのmove_iterator の差を求める |
C++11 |
operator+ |
イテレータを進める | C++11 |
make_move_iterator |
move_iterator のヘルパ関数 |
C++11 |
iter_move |
イテレータの要素の移動 | C++20 |
iter_swap |
イテレータの要素の交換 | C++20 |
move_sentinel
との間の操作
名前 | 説明 | 対応バージョン |
---|---|---|
operator== |
等値比較 | C++20 |
operator!= |
非等値比較(== により使用可能) |
C++20 |
operator- |
move_iterator と終端との差を求める |
C++20 |
例
#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>
#include <iterator>
int main()
{
std::vector<std::unique_ptr<int>> v;
for (int i = 0; i < 5; ++i)
v.emplace_back(new int(i));
std::vector<std::unique_ptr<int>> v2;
v2.assign(std::make_move_iterator(v.begin()),
std::make_move_iterator(v.end()));
std::for_each(v2.begin(), v2.end(),
[](const std::unique_ptr<int>& v) { std::cout << *v << std::endl; });
}
出力
0
1
2
3
4
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: ??