如何通过自定义Compare谓词对std::multimap按键升序、值降序排序?
实现std::multimap的自定义排序规则
完全可以通过自定义Compare谓词实现你要的排序逻辑:按键升序排列,键相同时按值降序排列。std::multimap的第三个模板参数就是用于指定排序规则的比较器,默认是std::less<Key>,我们只需要替换成自定义的逻辑即可。
实现方式1:自定义结构体作为比较器
定义一个重载operator()的结构体,实现我们需要的排序逻辑:
#include <map> #include <string> #include <iostream> struct CustomCompare { // 支持任意键值类型的模板化运算符 template <typename KeyType, typename ValueType> bool operator()(const std::pair<const KeyType, ValueType>& a, const std::pair<const KeyType, ValueType>& b) const { // 先按键升序比较 if (a.first != b.first) { return a.first < b.first; } // 键相等时,按值降序比较(这里用b.second < a.second来实现降序) return b.second < a.second; } }; int main() { // 使用自定义比较器创建multimap std::multimap<int, std::string, CustomCompare> myMap; // 插入测试数据 myMap.insert({1, "apple"}); myMap.insert({2, "banana"}); myMap.insert({1, "cherry"}); myMap.insert({1, "date"}); myMap.insert({2, "elderberry"}); // 遍历输出验证排序结果 for (const auto& entry : myMap) { std::cout << entry.first << ": " << entry.second << std::endl; } return 0; }
实现方式2:使用Lambda表达式(C++11及以上)
如果不想定义单独的结构体,用lambda表达式会更简洁:
#include <map> #include <string> #include <iostream> int main() { // 定义lambda作为比较器 auto comp = [](const auto& a, const auto& b) { if (a.first != b.first) { return a.first < b.first; } return b.second < a.second; }; // 用decltype推导lambda的类型,创建multimap std::multimap<int, std::string, decltype(comp)> myMap(comp); // 插入测试数据并输出(和上面示例一致) myMap.insert({1, "apple"}); myMap.insert({2, "banana"}); myMap.insert({1, "cherry"}); myMap.insert({1, "date"}); myMap.insert({2, "elderberry"}); for (const auto& entry : myMap) { std::cout << entry.first << ": " << entry.second << std::endl; } return 0; }
输出结果
两种方式的输出都是:
1: date 1: cherry 1: apple 2: elderberry 2: banana
完全符合按键升序、键同值降序的需求。
内容的提问来源于stack exchange,提问作者Abhishek kumar
相关产品推荐
相关产品推荐

