Когда я пытаюсь использовать 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;
}
РЕДАКТИРОВАТЬ (02.06.2019):
Я понял ошибку, что для CComBSTR не было хэш-функции и мы можем создать кастомную. Я хотел спросить, по какой причине дизайн std::set имеет хэш-функцию, но не std::unordered_set?





Проблема здесь в том, что компилятор не знает, как хэшировать ваш ключ. Чтобы исправить это, вам нужно предоставить пользовательскую хэш-функцию:
#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;
}
Спасибо за ответы. Я понял, что означает ошибка и как исправить. Пожалуйста, смотрите мое редактирование.
what is the design reason for std::set to have a hash function but not std::unordered_set?На самом деле все наоборот.std_setреализован как сбалансированное дерево, что означает, что его содержимое по своей природе отсортировано, но время вставки и время доступа равны O(NlogN).std::unordered_setреализован в виде хеш-таблицы, что означает, что обе эти операции выполняются за O(1). Что вы решите использовать, зависит от вашего варианта использования.