2016-03-07 81 views
4

如果我有std::dequestd::vector并希望将它们组合到std::deque,我能做到这一点的方式如下:移动的std ::矢量到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.insert(...)之前,我们无法在std::deque的末尾预留内存。 那么,将std::vector的所有元素移动到std::deque末尾的最快方法是?或者我错过了什么?

谢谢。

+0

当你说“移动”时,我认为“从矢量中获取元素,并将它们放入deque中”。你所展示的东西仍然留下矢量中存在的移动元素。 –

+0

T是移动应该比复制便宜的类型吗?对于没有区别的整数 – MikeMB

回答

0

我会用resize方法如下,因为比deque重新分配只有一次:

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

重新分配一个双端队列不是问题。当它需要更多空间时,它会添加一个新块。旧数据不会移动。这是矢量的双重优势,也是它没有'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。它只在vec的每个元素上应用std::movedeq的末尾。只要T只是一个int这与将矢量复制到deq的末尾并无太大区别。

+0

我不同意@MooingDuck,但我认为这相当于OP原始帖子。看不出更好,它只是个人喜好。 –

+0

我忽略了'deq(100)'。评论已删除。我会切换到+1,但我不能编辑答案: –

+0

我做了一些小改动 – Arne