在construction of a priority queue,选项(12)中说:
template< class InputIt >
priority_queue( InputIt first, InputIt last,
const Compare& compare = Compare(),
Container&& cont = Container() );
但我不知道如何使用它。
我有一个非空std::unordered_set<std::shared_ptr<MyStruct>> mySet
,我想将它转换为优先级队列。我还创建了一个比较器结构MyComparator
:
struct MyComparator {
bool operator()(const std::shared_ptr<myStruct>& a,
const std::shared_ptr<myStruct>& b){...}
};
现在我如何以更好的方式构建新的priority_queue myQueue
?我使用了以下内容并且有效:
std::priority_queue<std::shared_ptr<MyStruct>, std::deque<std::shared_ptr<MyStruct>, MyComparator>
myQueue(mySet.begin(), mySet.end());
我对矢量和双端都进行了基准测试,并且当尺寸相对较大(~30K)时,我发现deque的性能优于矢量。
由于我们已经知道mySet
的大小,我应该创建具有该大小的双端队列。但是如何用我自己的比较器和预定义的双端队列创建这个priority_queue,比如说myDeque
?
答案 0 :(得分:1)
由于您已经确定std::deque
的效果优于std::vector
,因此我认为您在构建priority_queue
方面可以做的更多}。正如您可能已经看到的那样,没有std::deque::reserve()
方法,因此根本无法创建具有提前分配内存的双端队列。对于大多数用例,这不是问题,因为deque vs vector的主要特征是deque不需要在插入新元素时复制元素。
如果您仍未达到所需的性能,您可以考虑存储原始指针(让智能指针保持在外面),或者只是将unordered_map
更改为常规map
并依赖于容器提供的排序。