我有以下用例:
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
时需要反转元素排序......
答案 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()));
其中q
是std::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));
可能会更有效率。