从unordered_set初始化priority_queue的最快方法是什么?

时间:2016-04-27 05:03:48

标签: c++11 stl

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

1 个答案:

答案 0 :(得分:1)

由于您已经确定std::deque的效果优于std::vector,因此我认为您在构建priority_queue方面可以做的更多}。正如您可能已经看到的那样,没有std::deque::reserve()方法,因此根本无法创建具有提前分配内存的双端队列。对于大多数用例,这不是问题,因为deque vs vector的主要特征是deque不需要在插入新元素时复制元素。

如果您仍未达到所需的性能,您可以考虑存储原始指针(让智能指针保持在外面),或者只是将unordered_map更改为常规map并依赖于容器提供的排序。