c++中map容器自定义元素比较规则的几种实现

c++中map容器自定义元素比较规则的几种实现

一、map/multimap基本概念

  1. map的特性是,所有元素都会根据元素的键值自动排序。
  2. map所有的元素都是pair,同时拥有键(key)和值(element),pair的第一元素被视为键值,第二元素被视为值
  3. map不允许两个元素有相同的键值
  4. multimap和map的操作类似,唯一区别multimap键值可重复。
  5. map和multimap都是以红黑树为底层实现机制。

二、基本数据类型作为(键)key时的排序

  1. 使用less或者greater结构体进行排序

    • /*
      map的默认比较器
      */
      void test2()
      {
      	//调用默认比较器  按照从大到小顺序排列 
      	//map<int, string,greater<int> > *pMap = new map<int, string,greater<int> >();
      
      	//从小到大顺序排列
      	map<int, string, less<int> > *pMap = new map<int, string, less<int> >();
      
      	//插入方法1
      	pMap->insert(make_pair(1, "jack"));
          //插入方法2
      	pMap->insert(pair<int, string>(5, "ben"));
          //插入方法3
      	pMap->insert(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++实现类似于hash_map容器,你可以使用标准库的unordered_map容器。unordered_map是一个使用哈希表实现的关联容器,可以存储键值对。 为了在unordered_map使用自定义对象作为键,你需要提供哈希函数和相等比较函数。哈希函数用于将键映射到哈希值,相等比较函数用于判断两个键是否相等。 下面是一个示例,演示了如何在unordered_map使用自定义对象作为键: ```cpp #include <unordered_map> #include <iostream> #include <functional> class MyObject { public: int x; int y; // 其他成员变量和方法 // 重载相等比较运算符 bool operator==(const MyObject& other) const { return x == other.x && y == other.y; } }; // 哈希函数 namespace std { template <> struct hash<MyObject> { std::size_t operator()(const MyObject& obj) const { // 使用std::hash组合哈希值 return std::hash<int>()(obj.x) ^ std::hash<int>()(obj.y); } }; } int main() { std::unordered_map<MyObject, int> myMap; MyObject obj1 {1, 2}; MyObject obj2 {3, 4}; myMap[obj1] = 10; myMap[obj2] = 20; std::cout << myMap[obj1] << std::endl; // 输出 10 std::cout << myMap[obj2] << std::endl; // 输出 20 return 0; } ``` 在上面的示例,我们定义了一个名为MyObject的自定义类。我们重载了相等比较运算符==,以便unordered_map能够正确比较两个MyObject对象是否相等。 为了使unordered_map能够正确地使用MyObject对象作为键,我们还定义了一个哈希函数。在这个示例,我们使用std::hash<int>来哈希MyObject对象的成员变量x和y,并使用异或操作符^将它们的哈希值组合起来。 最后在main函数,我们创建了一个unordered_map实例myMap,将MyObject对象作为键,并进行一些操作来验证容器的功能。 请注意,这只是一个示例,你可能需要根据你自己的需求进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值