增加和减少优先级队列的模板函数

Posted

技术标签:

【中文标题】增加和减少优先级队列的模板函数【英文标题】:Template function for increasing and decreasing priority queue 【发布时间】:2021-04-07 18:00:37 【问题描述】:

我想编写一个模板函数来打印递增和递减优先级队列。目前我已将其实现为

void print_queue1(priority_queue<int> q, string s)
    cout << "Value of prior queue " << s << " is : [";

    while(!q.empty())
        cout << " " << q.top() << ",";
        q.pop();
    
    cout << "]" << endl;



// min-heap
void print_queue2(priority_queue<int, vector<int>, greater<int>> q, string s)
    cout << "Value of prior queue " << s << " is : [";

    while(!q.empty())
        cout << " " << q.top() << ",";
        q.pop();
    
    cout << "]" << endl;


有没有办法编写一个可以做到这一点的模板函数?

【问题讨论】:

你见过the three template arguments that priority_queue uses吗?您的函数可以具有相同的参数,以相同的方式使用。 使用&lt;T, std::vector&lt;T&gt;, std::less&lt;T&gt;&gt;,我认为这不适用于std::greater 这些只是默认类型。我是说template&lt;class T,class Container, class Compare&gt; 会起作用。 你能把它写在答案中,可能对将来的初学者有所帮助 你在想其他人……我喜欢这样! 【参考方案1】:

您可以为此使用variadic function template。由于无论队列类型如何,逻辑都是相同的,因此我们可以接受任何类型的队列,例如

template <typename... Params>
void print_queue(priority_queue<Params...> q, string s)
    cout << "Value of prior queue " << s << " is : [";

    while(!q.empty())
        cout << " " << q.top() << ",";
        q.pop();
    
    cout << "]" << endl;

这里,Params 将由编译器从提供的priority_queue 的模板参数中推导出来,它会为每个不同的参数集印出一个具体的函数。

【讨论】:

哦,这看起来不错。没有意识到这一点。谢谢 @Naman 不用担心。乐意效劳。可变参数模板允许你做很多这样的简洁的事情。【参考方案2】:

模板类std::priority_queue使用three template type parameters。

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

您可以在函数中使用相同的三个参数来接受std::priority_queue 的任何实例化。

template<class T, class Container, class Compare>
void print_queue(priority_queue<T,Container,Compare> q, string s)
    cout << "Value of prior queue " << s << " is : [";

    while(!q.empty())
        cout << " " << q.top() << ",";
        q.pop();
    
    cout << "]" << endl;

或者,您可以删除/限制其中任何一个以强制执行优先级队列的子集..

template<class Container, class Compare>
void print_queue(priority_queue<int,Container,Compare> q, string s)
    // This function is really only designed for priority queues of int!
    cout << "Value of prior queue " << s << " is : [";

    while(!q.empty())
        cout << " " << q.top() << ",";
        q.pop();
    
    cout << "]" << endl;

【讨论】:

以上是关于增加和减少优先级队列的模板函数的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义比较器的最小优先级队列

单调队列单调栈优先队列模板

标准模板库中的优先队列(priority_queue)

C++ 标准模板库优先级队列抛出异常并显示消息“无效堆”

POJ 1442 优先队列 模板

c++ STL queue:deque+优先队列