c++ - 使用 GUID 作为 std::hash_map 中的键的 "right"方法是什么

标签 c++ visual-c++ boost stl

我想说

std::hash_map<GUID, int> foo;

我相信要做到这一点我必须创建一个

bool operator < (const GUID &guid1, const GUID &guid2);
std::size_t hash_value(GUID const &b);

比较 GUID 的正确方法是什么? (memcmp?) - 生成散列的正确方法是什么?

如果有人能充实这两个功能那就太好了,我已经阅读了几十篇文章,除了提供最后的线索之外,所有的事情都做了 :-)

最佳答案

来自 documentation似乎:

typedef struct _GUID {
  DWORD Data1;
  WORD  Data2;
  WORD  Data3;
  BYTE  Data4[8];
} GUID;

大概有几种可能

构建您自己的

为了比较,我会逐项进行比较

bool operator < (const GUID &guid1, const GUID &guid2) {
    if(guid1.Data1!=guid2.Data1) {
        return guid1.Data1 < guid2.Data1;
    }
    if(guid1.Data2!=guid2.Data2) {
        return guid1.Data2 < guid2.Data2;
    }
    if(guid1.Data3!=guid2.Data3) {
        return guid1.Data3 < guid2.Data3;
    }
    for(int i=0;i<8;i++) {
        if(guid1.Data4[i]!=guid2.Data4[i]) {
            return guid1.Data4[i] < guid2.Data4[i];
        }
    }
    return false;
}

对于散列...我会选择 UuidHash函数(请注意,GUID 是 UUID 的一种形式,如 UUID definition 中所示)

回到字符串

使用 StringFromCLSID从 GUID 中获取字符串...一旦有了字符串,您就拥有了所有运算符。

...这可能更贵。

关于c++ - 使用 GUID 作为 std::hash_map 中的键的 "right"方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24113864/

相关文章:

c++ - 为什么这个 Makefile 无法构建项目?

c++ - 逐像素比较 2 张图像(第一张图像存储在数据库中)

c++ - 在 boost 中将安全套接字作为普通套接字传递

c++ - 为什么隐式 DLL 链接需要相关的 Lib 文件而显式链接不需要?

c++ - 为什么 "using namespace"会尝试在该命名空间中为 MSVC 实例化模板

c++ - 输入流到 vector<char> - vector 迭代器不可取消引用

c++ - 如何检查 boost r-tree 中的任何 2d 点是否在给定的三角形中?

c++ - Chromium 嵌入式框架 (C++) 和另一个二进制文件之间的 IPC

visual-c++ - 设计一个适用于所有分辨率的MFC应用程序?

c++ - 如何使子控件处理父 CView 的加速器命令