1015 德才论用cmp排序
时间: 2025-01-13 20:57:18 浏览: 50
### C++ 中 `std::map` 按照 Value 进行排序
由于标准库中的 `std::map` 是基于键(key)进行自动排序的数据结构,无法直接按照值(value)排序。为了实现按值排序的需求,通常有两种方法:
#### 方法一:创建自定义比较器并使用 `std::set`
通过将 `std::pair<const T2, K>` 存储于 `std::set` 或者 `std::multiset` 来间接达到目的。这里假设有一个 `std::map<K,T2>` 类型的对象。
```cpp
#include <iostream>
#include <map>
#include <set>
// 定义一个辅助结构体用于反转 key 和 value 的顺序以便根据 value 排序
struct Pair {
int val;
const char* name;
bool operator<(const Pair& rhs) const {
return this->val < rhs.val; // 根据 value 值升序排列
}
};
int main() {
std::map<int, const char*> originalMap = {{1, "apple"}, {3, "banana"}, {2, "orange"}};
// 将 map 转换成 set 并依据 value 排序
std::set<Pair> sortedByValueSet;
for (auto&& elem : originalMap) {
sortedByValueSet.insert({elem.second, elem.first});
}
// 输出结果
for (auto it = sortedByValueSet.rbegin(); it != sortedByValueSet.rend(); ++it){
std::cout << "Key: " << it->name << ", Value: " << it->val << '\n';
}
return 0;
}
```
这种方法利用了 `std::set` 自动维护内部元素有序性的特点,并且可以通过重载 `<` 操作符来自定义排序逻辑[^1]。
#### 方法二:转换成向量再排序
另一种常见的方式是先将所有的键值对复制到一个支持随机访问迭代器的容器里(比如 `std::vector<std::pair<KeyType, ValueType>>`),之后调用通用算法如 `std::sort()` 对其执行排序操作。
```cpp
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
int main(){
std::map<int,std::string> my_map{{1,"z"},{2,"b"},{3,"a"}};
// 创建 vector<pair<...>>
std::vector<std::pair<int, std::string>> vec(my_map.begin(),my_map.end());
// 使用 lambda 表达式指定排序条件
sort(vec.begin(),vec.end(),
[](const auto& lhs,const auto& rhs){return lhs.second<rhs.second;} );
// 打印排序后的结果
for(auto& p : vec){
std::cout<<p.first<<" => "<<p.second<<"\n";
}
return 0;
}
```
此代码片段展示了如何把原始映射表的内容转移到一个新的动态数组中去处理,从而允许我们灵活地调整排序规则[^2]。
这两种方式各有优劣,在实际应用时可以根据具体需求选择合适的做法。如果只需要一次性获取一次排序的结果,那么第二种方案可能更加简单直观;而如果是频繁查询最大小项等情况,则建议采用第一种方案构建静态索引以提高效率。
阅读全文
相关推荐

















