【问题标题】:C++ Std queue and vector performanceC++ 标准队列和向量性能
【发布时间】:2016-06-06 08:42:39
【问题描述】:

我最近一直在使用图表,我正在考虑从图表中返回一条路径。需要将路径作为 std 向量返回,其中包含所有以起始节点为首的节点。

我一直在寻找两种选择: - 使用slow vector insert方法在vector前面添加节点 - 使用双端队列将节点添加到前面(push_front),这要快得多。然后使用 std::copy 将双端队列复制到向量中

使用一种方法比另一种方法有显着的性能提升吗?

【问题讨论】:

  • 为什么不推到向量的后面呢?
  • 如果您不需要直接访问元素,我建议使用链表
  • 我认为你应该专注于你可以找到你的路径的主要算法,而不是你选择的不是那么重要的数据结构,因为对于向量和出队来说,两者都是 O(n)。另外,你觉得std::copy不消耗时间和空间吗?
  • @Kilanny 在不了解确切使用模式的情况下很难推荐。由于缓存局部性差,列表的迭代时间比连续存储数据类型(例如 vector)要慢。
  • 你在标题中说queue,在正文中说deque。哪一个?两者都是标准库中的东西。

标签: c++ algorithm vector std deque


【解决方案1】:

如果您正在考虑将std::vector 包装在std::queue 中,那么std::queue 会将元素推送到向量的back(快速方式)。

即使不是,因为std::vector 是连续存储,即使您使用push_font(),它也有可能胜过std::deque,因为它与CPU 缓存配合得很好,其中洗牌数据很快.

但是为什么不尝试两者并分析代码以查看哪个性能更好呢?

【讨论】:

    【解决方案2】:

    由于您要返回一条路径,因此您可能对其长度有一个上限。因此,您可以调用创建vector、调用reserve 和稍后(如@user2079303 所写)调用push_back 以将顶点添加到路径。

    const auto n = <graph_size>
    std::vector<size_t> path;
    path.reserve(n)
    ...
    v.push_back(i); // Push whatever you want.
    

    现在的问题是,至少从问题来看,v 的顺序似乎是相反的。不过,您可以直接拨打std::reverse

    std::reverse(std::begin(v), std::end(v));
    

    所以,只使用vector

    • 您分配的是一个数据结构而不是两个;而且,使用reserve会有一个单一的内存分配。

    • 在末尾使用 reverse 只是简单地替换了从 deque 到 vector 的 copy 的使用。

    【讨论】:

    • 如果您记得使用vector.rbegin()vector.rend() 以相反的方式迭代返回值,则不需要std::reverse()。如果我知道容器的组织方式“错误”,我会发现反向迭代器非常方便!
    • @haavee 好点子——如果可能的话,你不妨颠倒“惯例”。
    猜你喜欢
    • 2016-09-26
    • 1970-01-01
    • 2013-11-21
    • 2010-12-03
    • 2015-02-17
    • 2013-05-06
    • 2011-05-10
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多