類模板
<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]); }
};
}

另見