类模板
<iterator>

std::move_iterator

template <class Iterator> class move_iterator;
移动迭代器
此类适配器适配一个迭代器,使其解引用时产生右值引用(如同应用了 std::move),而所有其他操作则与常规迭代器行为一致。

这个迭代器适配器维护一个迭代器的内部副本(称为其基迭代器),所有操作都反映在该基迭代器上。可以通过调用成员函数 base 来随时获取具有当前状态的基迭代器的副本。

模板参数

迭代器
一个输入迭代器类型。
使用其某些成员可能需要迭代器类别为双向随机访问

成员类型

成员定义于 move_iterator描述
iterator_type迭代器Iterator 的类型
iterator_categoryiterator_traits<Iterator>::iterator_category保留 Iterator 的类别
value_typeiterator_traits<Iterator>::value_type保留 Iterator 的值类型
difference_typeiterator_traits<Iterator>::difference_type保留 Iterator 的差值类型
指针迭代器(与 iterator_type 相同)
引用value_type&&

成员函数


非成员函数重载


非成员辅助函数


示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// move_iterator example
#include <iostream>     // std::cout
#include <iterator>     // std::move_iterator
#include <vector>       // std::vector
#include <string>       // std::string
#include <algorithm>    // std::copy

int main () {
  std::vector<std::string> foo (3);
  std::vector<std::string> bar {"one","two","three"};

  typedef std::vector<std::string>::iterator Iter;

  std::copy ( std::move_iterator<Iter>(bar.begin()),
              std::move_iterator<Iter>(bar.end()),
              foo.begin() );

  // bar now contains unspecified values; clear it:
  bar.clear();

  std::cout << "foo:";
  for (std::string& x : foo) std::cout << ' ' << x;
  std::cout << '\n';

  return 0;
}

输出

foo: one two three


可能的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
namespace std {
template <class Iterator> class move_iterator {
  Iterator current;
public:
  typedef Iterator iterator_type;
  typedef typename iterator_traits<Iterator>::iterator_category iterator_category;
  typedef typename iterator_traits<Iterator>::value_type        value_type;
  typedef typename iterator_traits<Iterator>::difference_type   difference_type;
  typedef Iterator pointer
  typedef value_type&& reference;

  move_iterator() {}
  explicit move_iterator (Iterator it) : current(it) {}
  template <class Iter> move_iterator (const move_iterator<Iter>& it) : current(it.current) {}
  template <class Iter> move_iterator& operator= (const move_iterator<Iter>& it)
  { current = it.current; }

  iterator_type base() const { return current; }
  pointer operator->() const { return current; }
  reference operator*() const { return std::move(*current); }
  move_iterator& operator++() { ++current; return *this; }
  move_iterator& operator--() { --current; return *this; }
  move_iterator& operator++(int) { move_iterator temp = *this; ++current; return temp; }
  move_iterator& operator--(int) { move_iterator temp = *this; --current; return temp; }
  move_iterator operator+ (difference_type n) const { return move_iterator(current+n); }
  move_iterator operator- (difference_type n) const { return move_iterator(current-n); }
  move_iterator operator+= (difference_type n) { current+=n; return *this; }
  move_iterator operator-= (difference_type n) { current-=n; return *this; }
  auto operator[](difference_type n) const -> decltype(std::move(current[n]))
  { return std::move(current[n]); }
};
}

另见