用于unordered_set<BSTR>的 Hash & EqualTo 函数

Hash & EqualTo functions for unordered_set<BSTR>

本文关键字:Hash EqualTo 函数 gt BSTR set unordered lt 用于      更新时间:2023-10-16

在代码中,将Windows样式的OLE字符串(BSTR's(插入到好的ol'STL容器中 - unordered_map<BSTR>,我声明了unordered_set,如下所示:

unordered_set<BSTR, std::hash<std::wstring>, std::equal_to<std::wstring>> usetBstr;

期望BSTR字符串像 wstring S 一样。

一切似乎都很好,直到有一天,一个在弦中间带有零wcharBSTR被放入unordered_set中。

当然!,当编译器将BSTR转换为std::wstring时,它会在字符串中找到的第一个空终止符处停止,因为wstring并不是真正BSTR字符串(它们在紧邻 BSTR 数据的内存字中保持它们的长度,而wstring在其他地方保持它们的长度(。

问题:在这种情况下,STL 库中的哪些HashEqualTo函数适合unordered_map<BSTR>

附言当然,我可以推出自己的功能,但我更喜欢将已经包含在标准中的东西。

使用 std::hash<std::wstring>std::equal_to<std::wstring> 的问题在于,当编译器将BSTR转换为 std::wstring 时,它会在字符串中找到的第一个空终止符处停止。 这意味着"this""this"在散列和检查相等性时成为同一字符串。

您需要提供一个适配器,该适配器将正确构造的std::wstring/std::wstring_view传递给哈希和相等函数。 您可以通过创建自己的函子来做到这一点,例如

struct BSTR_hash
{
    std::size_t operator()(BSTR const& s) const noexcept
    {
        return std::hash<std::wstring_view>{}({s, SysStringLen(s)});
    }
};
struct BSTR_equal_to
{
    bool operator()(BSTR const& lhs, BSTR const& rhs) const noexcept
    {
        return std::wstring_view(lhs, SysStringLen(lhs)) == std::wstring_view(rhs, SysStringLen(rhs));
    }
};
unordered_set<BSTR, BSTR_hash, BSTR_equal_to> usetBstr;