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

如何在C++中创建元素按降序排列的set的map?

在C++中实现值为降序set的map

要实现一个键为int、值为**降序排列的set<int>**的map,你需要注意set比较器的正确指定,以及map初始化时的语法问题。以下是修正后的可行方案:

方案一:使用标准库的std::greater<int>(推荐)

这是最简单的实现方式,直接利用标准库提供的降序比较器:

#include <iostream>
#include <map>
#include <set>
#include <functional>

int main() {
    // 指定set的比较器为std::greater<int>,实现元素降序
    std::map<int, std::set<int, std::greater<int>>> ms;
    
    ms[1].insert(13);
    ms[1].insert(10);
    ms[1].insert(23);
    ms[2].insert(33);
    ms[2].insert(3);
    
    // 遍历输出
    for (const auto& pair : ms) {
        for (int num : pair.second) {
            std::cout << num << " ";
        }
        std::cout << "\n";
    }
    return 0;
}

输出结果:

23 13 10 
33 3 

方案二:使用自定义lambda比较器

如果需要自定义比较逻辑(本例中是降序,和greater<int>效果一致),需要注意不同C++版本的兼容性:

适用于C++17及以下版本

C++17及以下中,无捕获的lambda不可默认构造,因此不能直接用map::operator[](会默认构造set),需要手动构造set并插入到map中:

#include <iostream>
#include <map>
#include <set>

int main() {
    auto cmpli = [](const int& a, const int& b) {
        return a > b;
    };
    
    // 声明map,值类型为带自定义比较器的set
    std::map<int, std::set<int, decltype(cmpli)>> ms;
    
    // 手动构造set并传入比较器,插入到map中
    ms.emplace(1, std::set<int, decltype(cmpli)>(cmpli));
    ms[1].insert(13);
    ms[1].insert(10);
    ms[1].insert(23);
    
    ms.emplace(2, std::set<int, decltype(cmpli)>(cmpli));
    ms[2].insert(33);
    ms[2].insert(3);
    
    // 遍历输出
    for (const auto& pair : ms) {
        for (int num : pair.second) {
            std::cout << num << " ";
        }
        std::cout << "\n";
    }
    return 0;
}

适用于C++20及以上版本

C++20开始,无捕获的lambda支持默认构造,可以直接使用map::operator[]:

#include <iostream>
#include <map>
#include <set>

int main() {
    auto cmpli = [](const int& a, const int& b) {
        return a > b;
    };
    
    std::map<int, std::set<int, decltype(cmpli)>> ms;
    
    // 直接使用operator[],set会自动用lambda默认构造比较器
    ms[1].insert(13);
    ms[1].insert(10);
    ms[1].insert(23);
    ms[2].insert(33);
    ms[2].insert(3);
    
    // 遍历输出
    for (const auto& pair : ms) {
        for (int num : pair.second) {
            std::cout << num << " ";
        }
        std::cout << "\n";
    }
    return 0;
}

原代码的问题说明

你提供的代码中,map的声明存在语法错误:

// 错误写法
map<int, set<int, decltype(cmpli)>(cmpli)>ms;

map的第二个模板参数需要是类型,而不是set的实例。正确的类型应该是std::set<int, decltype(cmpli)>,而非std::set<int, decltype(cmpli)>(cmpli)。

内容的提问来源于stack exchange,提问作者Omprakash kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:57:35