Есть ли стандартный способ перемещения диапазона в вектор?
==========================================================

Рассмотрим следующую программу, которая вставляет диапазон элементов в вектор:

Это эффективно копирует диапазон, выделяя достаточно места в целевом векторе для всего диапазона, так что потребуется максимум одно изменение размера. Теперь рассмотрим следующую программу, которая пытается переместить диапазон в вектор:

Это выполняет успешное перемещение, но не пользуется преимуществами, которые вставляет () в отношении предварительного выделения пространства в целевом векторе, поэтому вектор может быть изменен несколько раз во время операции.

Итак, мой вопрос, есть ли эквивалент вставки, который может переместить диапазон в вектор?

Вы используете`move_iterator` с`insert`:

Пример в 24.5.3 почти такой.

Вы получите нужную оптимизацию, если (а)`vector::insert` использует диспетчер тега итератора для обнаружения итератора с произвольным доступом и предварительного расчета размера (который, как вы предполагали, он делает в своем примере, который копирует), и (b)`move_iterator` сохраняет категорию итератора для итератора, который он переносит (что требуется стандартом).

Неясный момент: я уверен, что`vector::insert` Можно использовать исключение из источника (что здесь не имеет значения, поскольку источник того же типа, что и пункт назначения, поэтому emplace аналогичен копированию / перемещению, но будет иметь отношение к другим идентичным примерам). Я еще не нашел утверждения, что для этого требуется, я просто сделал вывод из того факта, что требование к паре итераторов`i,j` перешел к`insert` в том, что`T` быть`EmplaceConstructible` от`*i`.



1. [`std::move`](http://en.cppreference.com/w/cpp/algorithm/move) algorithm with preallocation:
2. The following would be more flexible yet:

Steve Jessop provided background information on precisely what it does and probably how it does so.