如何在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
相关产品推荐
相关产品推荐

