【问题标题】:c++ priority_queue push/emplace without temporary object creationc++ priority_queue push/emplace 没有临时对象创建
【发布时间】:2013-02-12 14:28:33
【问题描述】:

我了解到emplace_back 方法将对象推送到向量中而无需临时创建对象。但是,我找不到使用pushemplace 为priority_queue 实现此目的的方法。有没有一种有效的方法来实现这一目标?或者使用 boost 的 shared_ptr 之类的容器在性能方面很好。

【问题讨论】:

  • 我不关注。 std::priority_queue::emplace 应该将其参数转发到底层容器 emplace_back。您使用的是哪个编译器/版本?请注意,虽然没有创建临时对象,但为了维护堆,将会发生大量交换。
  • 那么,你知道玩 stl 容器最有效的方法是什么吗?即推送、弹出等。就性能而言,Boost 是不是最好的?
  • @IanDecks 嗯?你需要一个基于堆的优先级队列(O(logn) 插入和删除,不更新优先级),使用std::priority_queue,你想在不创建临时对象的情况下将东西推入其中,使用emplace 而不是push。所以呢?想做一些完全不同的事情,然后做一些完全不同的事情,忘记std::priority_queue

标签: c++ performance stl containers copy-constructor


【解决方案1】:

std::priority_queue 只是一个容器适配器,它使用堆操作包装底层容器(默认为std::vector)。所以为了在push里面添加一些东西而不创建一个临时的,那么std::priority_queue::emplace正是你想要使用的。

当然,您不能将任何东西放入队列中的任意位置(并且您的推送元素不一定会在容器的末尾结束),因为它是优先级队列维护和内部顺序。但是,如果那是您想要做的,那么无论如何您选择了错误的容器(或容器适配器)。

不,如果shared_ptr 只是关于性能而不是生命周期管理,那么它很少是可行的替代方案。您是否需要动态内存分配,所以这不是一个选项,尤其是在 C++11 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多