gpt4 book ai didi

c++ - 为什么 std::unordered_set 不将 CComBSTR 类型作为键?

转载 作者:行者123 更新时间:2023-11-30 04:46:59 25 4
gpt4 key购买 nike

当我尝试使用 std::unordered_set<CComBSTR> 时(或 std::unordered_set<CAdapt<CComBSTR>> ),我收到错误

c:\apps\vs2017pro\vc\tools\msvc\14.16.27023\include\unordered_set(105) : error C2280 : 'std::hash<_Kty>::hash(const std::hash<_Kty> &)' : attempting to reference a deleted function
with
[
_Kty = ATL::CComBSTR
]

但是std::set<CComBSTR> (或 std::set<CAdapt<CComBSTR>> )没问题。我正在使用 Visual Studio 2017。

怎样做才能达到搜索的O(1)时间复杂度?(当然,我们可以使用自定义哈希函数来实现搜索的O(1)时间复杂度。)

最小的可重现示例如下。

#include "atlbase.h" 
#include <unordered_set>
#include <set>

int main()
{
//std::unordered_set<CComBSTR> s; // compile error
//std::unordered_set<CAdapt<CComBSTR>> s; // compile error

//std::set<CComBSTR> s; // ok
//std::set<CAdapt<CComBSTR>> s; // ok

return 0;
}

编辑(06/02/2019):

我理解错误是 CComBSTR 没有哈希函数我们可以创建一个自定义的。我想问的是 std::set 的设计原因是什么?有哈希函数但没有 std::unordered_set

最佳答案

这里的问题是编译器不知道如何散列你的 key 。要解决此问题,您需要提供自定义哈希函数:

#include "atlbase.h" 
#include <unordered_set>
#include <set>
#include <string>

struct HashBSTR
{
size_t operator () (const CComBSTR &bstr)
{
return std::hash <std::wstring> () (bstr.m_str);
}
};


int main()
{
std::unordered_set <CComBSTR, HashBSTR> s;
return 0;
}

关于c++ - 为什么 std::unordered_set 不将 CComBSTR 类型作为键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56398921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com