将std :: vector移动到C ++ 11中的std :: deque

时间:2016-03-07 13:26:20

标签: c++ c++11 stdvector c++-standard-library stddeque

如果我有std::dequestd::vector并希望将它们合并到std::deque,我可以通过以下方式执行此操作:

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末尾的最快方法吗?或者我错过了什么?

谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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的末尾没什么不同。