Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将deque或LIFO容器转换为std::vector_C++_C++11_Stl - Fatal编程技术网

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

C++ 将deque或LIFO容器转换为std::vector,c++,c++11,stl,C++,C++11,Stl,我有以下用例: containerTypeX在前面插入许多元素的对象 containerTypeX对象插入所有内容后,需要将containerXType对象转换为std::vector 对于containerTypeX,我选择了std::deque而不是std::vector,因为据我所知,在std::vector的开头插入是没有效率的。 但是现在我必须将std::deque转换为std::vector,并且不希望将队列中的每个元素单独移动到向量,就像 v.emplace_back(std:

我有以下用例:

  • 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
,因为我只插入一面?但这将给我留下一个问题,即当转换为
std::vector
时,元素顺序需要颠倒

相关问题:

但是,如注释中所述,直接在
v
末尾插入,并颠倒元素顺序(如果确实需要)

可能会更有效率

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

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

使用接受一对开始/结束迭代器的
std::vector
构造函数和
std::make\u move\u迭代器
适配器,将元素从旧容器移动到新的
std::vector
怎么样

我是说

std::vector<containedType> v(std::make_move_iterator(q.begin()),
                             std::make_move_iterator(q.end()));
其中
s
是后进先出容器


但是,正如评论中所建议的,您确定需要此转换吗?如果使用
std::vector
作为后进先出容器(因此在末尾添加元素),那么使用反向运算符将其反向使用如何?

为什么必须在前面插入?你不能简单地在后面插入并假装容器是反向的吗?@user463035818此外,你可以使用
std::reverse
来反转
向量中元素的顺序。如果元素交换是有效的,这应该是快速的。插入与图形路径探索算法有关。一旦我找到路径中的最后一个元素,我会追溯并在前面插入以前的节点,以使整个路径按正确的顺序排列。@DanielLangr我理解OP,他们只希望“containerTypeX”有效地填充它,然后将其转换为向量,因此,实际上,元素的排列顺序根本不重要。这几乎就像是当
std::vector::rbegin()
std::vector::rend()
被创建时计划的使用一样。如果他们可以创建一个新的向量,那么就更简单了:
vector(begin(q),end(q))
@user207933,它可以复制而不是移动。有关该问题的正确版本,请参阅max66的答案。
std::reverse(std::begin(v), std::end(v));
std::vector<containedType> v(std::make_move_iterator(q.begin()),
                             std::make_move_iterator(q.end()));
std::vector<containedType> v(std::make_move_iterator(s.rbegin()),
                             std::make_move_iterator(s.rend()));