2016-03-07 2 views
4

Если у меня есть std::deque и std::vector и хотите объединить их std::deque, я могу сделать это следующим образом:Move станд :: вектор к StD :: Deque в C++ 11

typedef int T; // type int will serve just for illustration 
std::deque<T> deq(100); // just some random size here 
std::vector<T> vec(50); 
// ... doing some filling ... 
// now moving vector to the end of queue: 
deq.insert( 
    deq.end(), 
    std::make_move_iterator(vec.begin()), 
    std::make_move_iterator(vec.end()) 
); 
std::cout << deq.size() << std::endl; 

Мы знаем, размер вектора, но мы не можем зарезервировать память в конце std::deque перед использованием std::deque.insert(...). Так это самый быстрый способ переместить все элементы std::vector в конец std::deque? Или я что-то пропустил?

спасибо.

+0

Когда вы говорите «перемещение», я думаю: «Возьмите элементы из вектора и поместите их в детекс». Что вы показали, все же оставляет перемещенные элементы, присутствующие в векторе. –

+0

Является ли тип T, для которого перемещение должно быть дешевле, чем копирование? Для ints не имеет значения – MikeMB

ответ

0

Я хотел бы использовать resize метод следующим образом, потому что, чем deque перераспределены только один раз:

size_t oldSize = deq.size(); 
deq.resize(deq.size() + vec.size()); 
copy(vec.begin(), vec.end(), deq.begin() + oldSize); 
+0

Перераспределение в deque не является проблемой. Когда ему нужно больше места, он добавляет новый блок. Старые данные не перемещаются. Это преимущество deque над вектором, а также почему у него нет 'reserve()'. Сначала проблема с выполнением переразмера состоит в том, что он заставляет все элементы быть построенными. Затем вы выполняете операцию присваивания для каждого из копируемых элементов. Это может не повлиять на данные POD, но все, что было бы сложно, было бы неэффективным. –

0

попробовать это:

using T = int; // type int will serve just for illustration 

std::deque<T> deq(100); // just some random size 
std::vector<T> vec(50); 
// ... doing some filling ... 
// now moving vector to the end of queue: 
std::move( 
    begin(vec), 
    end(vec), 
    back_inserter(deq) 
); 
std::cout << deq.size() << std::endl; 

Имейте в виду, что это по-прежнему копирует vector до конца deq. Он просто применяет std::move к каждому элементу vec до конца deq. Пока T - всего лишь int, это не сильно отличается от копирования вектора до конца deq.

+0

Я не согласен с @MooingDuck, но я вижу это как эквивалент исходного сообщения OP. Не видишь ни лучшего, это просто личное предпочтение. –

+0

Я не обратил внимания на 'deq (100)'. Комментарий удален. Я бы переключился на +1, но не могу, пока не будет отредактирован ответ :( –

+0

Я сделал некоторые незначительные изменения – Arne

Смежные вопросы