Подобно стандартным итераторам вставки, можно иметь дело с вставкой перемещения таким же образом, как запись в массив. Специальный вид адаптеров итераторов, называемых итераторами вставки движения, снабжен этой библиотекой. с регулярными классами итераторов,
while (first != last) *result++ = *first++;
Это приводит к тому, что диапазон [первый, последний] копируется в диапазон, начинающийся с результата. Тот же код с результатом, являющимся ходом вставки итератора, будет перемещать вставку соответствующих элементов в контейнер. Это устройство позволяет всем алгоритмам копирования в библиотеке работать в режиме вставки движения вместо обычного режима перезаписи. Эта библиотека предлагает 3 итератора вставки и их вспомогательные функции:
template <typename C>
class back_move_insert_iterator;
template <typename C>
back_move_insert_iterator<C> back_move_inserter(C& x);
template <typename C>
class front_move_insert_iterator;
template <typename C>
front_move_insert_iterator<C> front_move_inserter(C& x);
template <typename C>
class move_insert_iterator;
template <typename C>
move_insert_iterator<C> move_inserter(C& x, typename C::iterator it);
Итератор вставки хода построен из контейнера и, возможно, один из его итераторов указывает, где происходит вставка, если она не находится ни в начале, ни в конце контейнера. Включить итераторы, удовлетворяющие требованиям выходных итераторов.<operator*
>возвращает ход вставки самого итератора. Назначение<operator=(T&x)
>определено на итераторах вставки, чтобы разрешить запись в них, оно вставляет x непосредственно перед тем, куда указывает итератор вставки. Другими словами,<insertiterator
>похож на курсор, указывающий в контейнер, где происходит вставка.<back_move_iterator
>перемещать вставки элементов в конце контейнера,<front_insert_iterator
>перемещать вставки элементов в начале контейнера и<move_insert_iterator
>перемещать вставки элементов, где итератор указывает на контейнер.<back_move_inserter
>,<front_move_inserter
>и<move_inserter
>являются тремя функциями, делающими итераторы вставки из контейнера. Вот пример того, как их использовать:
#include <boost/container/list.hpp>
#include "movable.hpp"
#include <cassert>
#include <algorithm>
using namespace ::boost::container;
typedef list<movable> list_t;
typedef list_t::iterator l_iterator;
template<class MoveInsertIterator>
void test_move_inserter(list_t &l2, MoveInsertIterator mit)
{
list<movable> l(10);
assert(!l.begin()->moved());
l2.clear();
std::copy(l.begin(), l.end(), mit);
assert(l2.size() == l.size());
assert(l.begin()->moved());
assert(!l2.begin()->moved());
}
int main()
{
list_t l2;
test_move_inserter(l2, boost::back_move_inserter(l2));
test_move_inserter(l2, boost::front_move_inserter(l2));
test_move_inserter(l2, boost::move_inserter(l2, l2.end()));
return 0;
}