unordered_map的键值不能直接用pair;而map 可以使用 pair 作为键值,而不需要额外定义哈希函数

如果写了unordered_map< pair ... ,会报奇怪的错误:

但是换成map就好了。

------------------

unordered_map:

unordered_map 的键值类型可以是 pair,但在使用时需要注意一些问题。让我来解释一下:

  1. 自定义哈希函数 :由于 unordered_map 默认不支持 pair 作为键值,你需要提供一个哈希函数来告诉编译器如何计算 pair 类型的哈希值。你可以通过重载 std::hash 模板来实现这一点。

  2. 定义哈希函数 :你可以自己定义一个哈希函数,用于计算 pair 类型的哈希值。这个哈希函数应该接受一个 pair 类型的参数,并返回一个 size_t 类型的哈希值。

  3. 注意 std::pair 的哈希函数 :C++11 提供了 std::hash 模板的特化版本用于 std::pair,但你需要确保 std::hash 已经包含在你的头文件中。

下面是一个示例,展示了如何定义一个哈希函数来支持 pair 作为 unordered_map 的键值:

(注意是重写unordered_map的第三个模板参数(哈希函数类型))

具体来说,在 unordered_map<Key, T, Hash, KeyEqual, Allocator> 中:

  • Key 是键类型。
  • T 是值类型。
  • Hash 是哈希函数类型。
  • KeyEqual 是键相等比较器类型(默认为 std::equal_to<Key>)。
  • Allocator 是分配器类型(默认为 std::allocator<std::pair<const Key, T>>)。

#include <iostream>
#include <unordered_map>

using namespace std;

// 自定义哈希函数
struct pair_hash {
    template <class T1, class T2>
    size_t operator () (const pair<T1,T2> &p) const {
        auto h1 = hash<T1>{}(p.first);
        auto h2 = hash<T2>{}(p.second);
        return h1 ^ h2; // 哈希组合
    }
};

int main() {
    unordered_map<pair<int, int>, int, pair_hash> myMap;

    // 添加键值对
    myMap[make_pair(1, 2)] = 10;
    myMap[make_pair(3, 4)] = 20;

    // 访问键值对
    cout << myMap[make_pair(1, 2)] << endl; // 输出 10
    cout << myMap[make_pair(3, 4)] << endl; // 输出 20

    return 0;
}

在这个示例中,我们定义了一个名为 pair_hash 的结构体,重载了 operator() 来计算 pair 类型的哈希值。然后在定义 unordered_map 时,指定了这个自定义的哈希函数。

------------------

map:

map 可以使用 pair 作为键值,而不需要额外定义哈希函数。这是因为 map 使用红黑树(Red-Black Tree)来实现,而不是哈希表。

红黑树是一种自平衡二叉搜索树,它在插入和删除操作时通过一系列旋转和颜色变换来保持树的平衡,从而保证了插入、删除和搜索的时间复杂度都是 O(log n)。

map 中,pair 的比较方式取决于 pair 中两个元素的比较方式。具体来说,map 会根据 pair 的第一个元素进行比较,如果第一个元素相等,则比较第二个元素。 所以,pair 的比较不是简单地将两个元素相加,而是按照元素的大小依次比较。

例如,对于 pair<int, int> 类型的键值,map 会按照先比较第一个整数,如果相等再比较第二个整数。

相关推荐
王老师青少年编程3 小时前
gesp(C++五级)(14)洛谷:B4071:[GESP202412 五级] 武器强化
开发语言·c++·算法·gesp·csp·信奥赛
DogDaoDao3 小时前
leetcode 面试经典 150 题:有效的括号
c++·算法·leetcode·面试··stack·有效的括号
Coovally AI模型快速验证4 小时前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
可为测控4 小时前
图像处理基础(4):高斯滤波器详解
人工智能·算法·计算机视觉
Milk夜雨5 小时前
头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)
算法·贪心算法
BoBoo文睡不醒5 小时前
动态规划(DP)(细致讲解+例题分析)
算法·动态规划
apz_end6 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹6 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法
CM莫问7 小时前
python实战(十五)——中文手写体数字图像CNN分类
人工智能·python·深度学习·算法·cnn·图像分类·手写体识别
sz66cm7 小时前
LeetCode刷题 -- 45.跳跃游戏 II
算法·leetcode