You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:00:04