如何将C++ pair类型优先队列改为按书名字母升序排列?
问题描述
我想要创建一个存储书籍名称(string类型)和书籍长度(int类型)的pair类型优先队列,希望队列顶部是字母顺序最靠前的书名。默认情况下,优先队列是按逆字母序排列的,会输出:
(This Book, 100) (A Book, 200)
但我想要的是相反的顺序。我知道对于int等类型可以使用指定符std::greater<int>,请问针对pair类型我应该使用什么?谢谢!
附上代码:
#include <iostream> #include <queue> #include <utility> #include <string> using namespace std; int main(void){ pair <string, int> tPair; priority_queue <pair <string, int>> pq; pq.emplace("A Book", 200); pq.emplace("This Book", 100); while(pq.size() != 0){ tPair = pq.top(); cout << "(" << tPair.first << ", " << tPair.second << ")\n"; pq.pop(); } return 0; }
解决方案
你可以直接使用std::greater<std::pair<std::string, int>>作为优先队列的比较器,它会按照pair的第一个元素(书名)的升序排列,刚好满足“队列顶部是字母顺序最靠前的书名”的需求。
修改后的完整代码如下:
#include <iostream> #include <queue> #include <utility> #include <string> using namespace std; int main(void){ pair <string, int> tPair; // 指定比较器为std::greater,实现升序排列 priority_queue <pair <string, int>, vector<pair<string, int>>, greater<pair<string, int>>> pq; pq.emplace("A Book", 200); pq.emplace("This Book", 100); while(pq.size() != 0){ tPair = pq.top(); cout << "(" << tPair.first << ", " << tPair.second << ")\n"; pq.pop(); } return 0; }
原理说明
C++中std::pair的默认比较逻辑是:先比较第一个元素,若第一个元素相等再比较第二个元素。std::greater会反转这个比较逻辑,让较小的元素(字母序更靠前的书名)排在优先队列的顶部,最终输出顺序为:
(A Book, 200) (This Book, 100)
如果需要更个性化的排序规则,也可以自定义lambda或结构体作为比较器,但针对你的需求,直接使用std::greater<std::pair<...>>是最简洁的方案。
内容的提问来源于stack exchange,提问作者YWH
相关产品推荐
相关产品推荐

