创建按照加入顺序排序的map

大家都知道treemap是有序的map,不过默认是 自然序,有时需要按照添加顺序进行排序的map,其实只需要加入一个自定义的 Comparator即可 、
  1.     static class DftComparetor implements  Comparator<String>{
  2.         List<String> l = new LinkedList<String>();
  3.         public int compare(String o1, String o2) {
  4.             int index1 = l.indexOf(o1);
  5.             int index2 = l.indexOf(o2);
  6.             if(index1 == -1){
  7.                 l.add(o1);
  8.                 index1 = l.size() -1;
  9.             }
  10.             
  11.             if(index2 == -1){
  12.                 l.add(o1);
  13.                 index1 = l.size() -1;
  14.             }
  15.             return index1 - index2;
  16.         }
  17.         
  18.     }
使用的时候方法:
new TreeMap<String,String>(new DftComparetor())
### 关于 `std::map` 的默认行为及其自定义排序 #### 默认情况下 `std::map` 如何处理元素顺序 `std::map` 并不是基于插入顺序来管理其内部元素的排列;相反,它依据键值进行自我维护以保持升序状态[^1]。这意味着每当有新的键值对被加入到映射中时,该容器会根据预设比较函数自动调整位置,从而确保所有项始终遵循特定次序。 对于为何不采用插入序列作为组织原则,原因在于设计初衷旨在提供高效查找性能的同时维持稳定且可预测的数据访问模式。通过强制执行某种形式上的内在秩序——通常是递增或递减——使得定位任意给定键变得更为迅速便捷。 ```cpp #include <iostream> #include <map> int main() { std::map<int, char> myMap; // 插入不同顺序的关键字 myMap.insert({2,'b'}); myMap.insert({1,'a'}); myMap.insert({3,'c'}); for (auto& pair : myMap){ std::cout << "{" << pair.first << ": " << pair.second << "}\n"; } } ``` 上述代码片段展示了即使是以无规律的方式向 `std::map` 中添加条目,最终输出仍然依照从小到大的自然数列展示出来。 #### 实现自定义排序方法 为了改变这种既定的行为并引入个性化的排序逻辑,可以在声明 `std::map` 类型变量的时候指定第三个参数即比较器(comparator),这是一个二元谓词用来决定两个对象之间相对大小关系。下面的例子说明了如何创建一个降序排列整数类型的关联数组: ```cpp #include <iostream> #include <map> #include <functional> // 自定义比较器类 struct GreaterThanComparator { bool operator()(const int &lhs, const int &rhs) const { return lhs > rhs; } }; int main(){ // 使用自定义比较器构建 map std::map<int, double, GreaterThanComparator> descendingMap; descendingMap.emplace(5, 0.7); descendingMap.emplace(1, 0.9); for(auto &[key,value]:descendingMap){ std::cout<< key <<" -> "<< value<<"\n"; } return 0; } ``` 这段程序利用了一个名为 `GreaterThanComparator` 的结构体实现了逆向对比机制,并将其应用于实例化过程中,因此当遍历打印内容时可以看到数值是从大至小依次呈现出来的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值