template<class Iterator>
class move_iterator;
template<class It>
move_iterator<It> make_move_iterator(const It &it);
<move_iterator
>является адаптером итератора с тем же поведением, что и базовый итератор, за исключением того, что его оператор отсчета неявно преобразует значение, возвращаемое оператором отсчета отсчета от базового итератора, в ссылку на значение r:<boost::move(*underlying_iterator)
>Это итератор считывания, но он может иметь характеристики случайного доступа.
<move_iterator
>Это очень полезно, потому что некоторые общие алгоритмы и функции вставки контейнеров могут быть вызваны итераторами перемещения, чтобы заменить копирование движением. Например:
#include <boost/move/core.hpp>
#include <boost/move/traits.hpp>
class movable
{
BOOST_MOVABLE_BUT_NOT_COPYABLE(movable)
int value_;
public:
movable() : value_(1){}
movable(BOOST_RV_REF(movable) m)
{ value_ = m.value_; m.value_ = 0; }
movable & operator=(BOOST_RV_REF(movable) m)
{ value_ = m.value_; m.value_ = 0; return *this; }
bool moved() const
{ return !value_; }
int value() const
{ return value_; }
};
namespace boost{
template<>
struct has_nothrow_move<movable>
{
static const bool value = true;
};
}
<movable
>Объекты могут перемещаться из одного контейнера в другой с помощью итераторов перемещения и операций вставки и назначения. в
#include <boost/container/vector.hpp>
#include "movable.hpp"
#include <cassert>
int main()
{
using namespace ::boost::container;
vector<movable> v(10);
assert(!v[0].moved());
vector<movable> v2( boost::make_move_iterator(v.begin())
, boost::make_move_iterator(v.end()));
assert(v[0].moved());
assert(!v2[0].moved());
v.assign( boost::make_move_iterator(v2.begin())
, boost::make_move_iterator(v2.end()));
assert(v2[0].moved());
assert(!v[0].moved());
return 0;
}