用于unordered_set<BSTR>的 Hash & EqualTo 函数
Hash & EqualTo functions for unordered_set<BSTR>
在代码中,将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 一样。
一切似乎都很好,直到有一天,一个在弦中间带有零wchar
的BSTR
被放入unordered_set
中。
当然!,当编译器将BSTR
转换为std::wstring
时,它会在字符串中找到的第一个空终止符处停止,因为wstring
并不是真正BSTR
字符串(它们在紧邻 BSTR 数据的内存字中保持它们的长度,而wstring
在其他地方保持它们的长度(。
问题:在这种情况下,STL 库中的哪些Hash
和EqualTo
函数适合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;
相关文章:
- 什么是"#include <boost/functional/hash.hpp> "?
- 对自定义类使用 std::hash<uint64_t>
- std::hash<std::string> 可以为不同的字符串返回相同的值吗?
- C++std::hash实现总是确定性的吗
- std::hash for std::chrono::duration
- Hash for a std::pair, for use in an unordered_map
- 为什么在这种特殊情况下不需要将 std::hash() 的专用化注入到 std 命名空间中?
- 为什么当我在MD5 Hash中转换相同的C 字符串时,每次都会获得不同的输出
- 在使用 JNI 将 c++ unordered_map转换为 java hashMap之前将其转换为 java hash
- "The C++ Library doesen't provide a hash for this type." - 在 std::unordered_map 中使用自己的类
- Qt/C++ hash of hashes
- 为什么不区分大小写适用于 std::unordered_set的 std::hash 函数?
- 错误:未使用不完整的类型'struct std::hash<>'无效
- 用于unordered_set<BSTR>的 Hash & EqualTo 函数
- 无法专门化 std::hash 以unordered_map存储自定义类型
- 为模板类嵌套类定义 std::hash 时出现编译错误
- Return value of std::hash ofr (x86/x64)
- Xcode C++ MD5 hash
- 明确的专业化;'std::hash<_Kty>' 已被实例化
- STD :: HASH :: operator() - 例外保证