将deque或LIFO容器转换为std :: vector

时间:2018-02-16 10:30:31

标签: c++ c++11 stl

我有以下用例:

  • containerTypeX我在前面插入了许多元素的对象
  • containerTypeX对象插入所有内容后,containerXType对象需要转换为std::vector

对于containerTypeX,我选择std::deque而不是std::vector,因为据我所知,在std::vector的开头插入效率不高。 但现在我必须将std::deque转换为std::vector,并且不希望将每个元素从队列中分别移动到向量中,如

v.emplace_back(std::move(q.front()));

1)有没有办法直接将队列转换为我缺少的矢量?

2)我是否应该使用std::stack而不是std::deque的LIFO容器,因为我只插入一侧?但这会给我留下一个问题,即转换为std::vector时需要反转元素排序......

相关问题:How to convert std::queue to std::vector

2 个答案:

答案 0 :(得分:2)

  

我选择std::deque而不是std::vector,因为据我所知,在std::vector的开头插入效率不高

正确。

  

1)有没有办法直接将队列转换为我缺少的矢量?

使用接受开头/结尾迭代器和std::vector适配器的std::vector构造函数将元素从旧容器移动到新std::make_move_iterator怎么样?

我的意思是

std::vector<containedType> v(std::make_move_iterator(q.begin()),
                             std::make_move_iterator(q.end()));

其中qstd::deque

  

2)我是否应该使用std::stack而不是std::deque的LIFO容器,因为我只插入一侧?但这会给我留下一个问题,即转换为std::vector时需要反转元素排序......

您可以使用反向迭代器

进行相同的操作
std::vector<containedType> v(std::make_move_iterator(s.rbegin()),
                             std::make_move_iterator(s.rend()));

其中s是LIFO容器。

但是,正如评论中所建议的那样,您确定需要进行此转换吗?如果你使用std::vector作为LIFO容器(所以在最后添加元素),那么使用反向运算符可以反过来呢?

答案 1 :(得分:1)

v.reserve(q.size());
std::move(std::begin(q), std::end(q), std::back_inserter(v));
q.clear();
q.shrink_to_fit();

但是,如评论中所述,直接插入v的末尾并按

反转元素的顺序(如果确实需要)
std::reverse(std::begin(v), std::end(v));

可能会更有效率。