【问题标题】:convert deque or LIFO container to std::vector将双端队列或 LIFO 容器转换为 std::vector
【发布时间】:2018-02-16 10:30:31
【问题描述】:

我有以下用例:

  • 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 这样的LIFO 容器而不是std::deque,因为我只插入一侧?但这会给我留下一个问题,即在转换为std::vector时需要反转元素排序...

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

【问题讨论】:

  • 为什么一定要在前面插入呢?就不能直接插在后面假装容器倒过来吗?
  • @user463035818 此外,您可以使用std::reverse 反转vector 中元素的顺序。如果元素交换是有效的,这应该很快。
  • 插入与图路径探索算法有关。一旦我找到路径中的最后一个元素,我就会回溯并在前面插入先前的节点,以使整个路径按正确的顺序排列。
  • @DanielLangr 据我了解 OP,他们只希望“containerTypeX”有效地填充它,然后除了将其转换为向量之外什么都不做,所以实际上元素的顺序根本不重要
  • 这几乎就像在创建 std::vector::rbegin()std::vector::rend() 时计划使用的一样

标签: c++ c++11 stl


【解决方案1】:

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

正确。

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

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

我是说

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

qstd::deque 哪里?

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

你可以使用反向迭代器来做同样的事情

std::vector<containedType> v(std::make_move_iterator(s.rbegin()),
                             std::make_move_iterator(s.rend()));

其中s 是一个后进先出容器。

但是,正如 cmets 中所建议的,您确定需要这种转换吗?如果您使用 std::vector 作为 LIFO 容器(因此在末尾添加元素),那么将其与反向运算符反向使用呢?

【讨论】:

    【解决方案2】:
    v.reserve(q.size());
    std::move(std::begin(q), std::end(q), std::back_inserter(v));
    q.clear();
    q.shrink_to_fit();
    

    但是,如 cmets 中所述,直接在v 的末尾插入并通过

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

    可能会更有效率。

    【讨论】:

    • 如果他们可以创建一个新向量就更简单了:vector(begin(q), end(q)).
    • @user2079303 复制而不是移动。有关正确版本,请参阅 max66 的答案。
    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 2019-11-24
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多