C++11 从无序集合初始化优先级队列的最快方法是什么

C++11 从无序集合初始化优先级队列的最快方法是什么,c++11,stl,C++11,Stl,选项(12)中提到: 现在,我如何以更好的方式构造一个新的优先级队列myQueue?我使用了以下方法,并且效果良好: std::priority_queue<std::shared_ptr<MyStruct>, std::deque<std::shared_ptr<MyStruct>, MyComparator> myQueue(mySet.begin(), mySet.end()); std::priority\u queue既然您已经确定

选项(12)中提到:

现在,我如何以更好的方式构造一个新的优先级队列
myQueue
?我使用了以下方法,并且效果良好:

std::priority_queue<std::shared_ptr<MyStruct>, std::deque<std::shared_ptr<MyStruct>, MyComparator> 
    myQueue(mySet.begin(), mySet.end());

std::priority\u queue既然您已经确定
std::deque
std::vector
提供了更好的性能,我认为就如何构造
priority\u queue
而言,您可以做的事情不多。正如您可能已经看到的,没有
std::deque::reserve()
方法,因此不可能创建提前分配内存的deque。对于大多数用例来说,这不是问题,因为deque vs vector的主要特性是,在插入新元素时,deque不需要复制元素


如果你还没有达到你想要的性能,你可以考虑存储原始指针(保持你的智能指针在外面活着),或者简单地将您的

无序映射
更改为常规的
映射
,并依赖于容器提供的顺序。

之后是否要将更多元素插入优先级队列?是的,算法将弹出最重的元素,检查其状态,并可能添加与最重元素相关的更多对象。这种插入可能会发生多次(大约是原始大小的一半)。
struct MyComparator {
  bool operator()(const std::shared_ptr<myStruct>& a, 
                  const std::shared_ptr<myStruct>& b){...}
};
std::priority_queue<std::shared_ptr<MyStruct>, std::deque<std::shared_ptr<MyStruct>, MyComparator> 
    myQueue(mySet.begin(), mySet.end());