Подтвердить что ты не робот

Как обрабатывать отсутствующий "emplace_range" в С++ 0x STL?

У меня есть два контейнера, скажем, они определены следующим образом:

std::vector<std::unique_ptr<int>> a;
std::vector<std::unique_ptr<int>> b;

Предположим, что заполнены как a, так и b. Я хочу вставить весь контейнер a в определенное место в b, используя move-semantics, чтобы unique_ptr переместился на b. Пусть предположим, что i является допустимым итератором где-то в b. Не работает следующее:

b.insert(i, a.begin(), a.end()); // error: tries to copy, not move, unique_ptrs

Есть ли еще один алгоритм STL, который может достичь этого "вставки-диапазон за ходом"? Думаю, мне нужен тип emplace_range, но в VS2010 STL его нет. Я не хочу писать цикл, который вставляет один за другим, так как в итоге он будет неприятным O (n ^ 2) из-за смещения всего содержимого вектора каждый раз, когда он вставляет. Любые другие варианты?

4b9b3361

Ответ 1

auto a_begin = std::make_move_iterator(a.begin());
auto a_end = std::make_move_iterator(a.end());

b.insert(i, a_begin, a_end); 

Ответ 2

Вы insert требуемое количество пустых элементов в цели (одним выстрелом), а затем используйте swap_ranges. Исходные элементы будут бесполезны, так как это unique_ptr.

Это будет работать для pre-С++ 0x, но другой ответ явно лучше для Visual С++ 10.