C++11 从无序集合初始化优先级队列的最快方法是什么
选项(12)中提到: 现在,我如何以更好的方式构造一个新的优先级队列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既然您已经确定
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());