Ответ 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);
У меня есть два контейнера, скажем, они определены следующим образом:
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) из-за смещения всего содержимого вектора каждый раз, когда он вставляет. Любые другие варианты?
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);
Вы insert
требуемое количество пустых элементов в цели (одним выстрелом), а затем используйте swap_ranges
. Исходные элементы будут бесполезны, так как это unique_ptr
.
Это будет работать для pre-С++ 0x, но другой ответ явно лучше для Visual С++ 10.
Собственно, вы можете использовать старый добрый std::swap_ranges(...)