Unuporded_set of thear * требования?
-
28-09-2019 - |
Вопрос
Я хочу использовать структуру данных, которая служит как .NET HASHSET, я попытался использовать Unuported_set с методом хеширования по умолчанию и пользовательским сравнением следующим образом:
struct comparer
{
bool operator()( const TCHAR* first,const TCHAR* second) const
{
return _tcscmp((TCHAR*)first,(TCHAR*)second) == 0;
}
};
typedef unordered_set<const TCHAR*,hash<const TCHAR*>,comparer> HashSet;
Проблема в том, что я пытался использовать Hashtset, чтобы найти определенный ключ (используя find
метод) То есть я только что добавил, используя insert
Это возвращает HashSet::end()
!!
Не могли бы вы объяснить, в чем проблема? Я использую VC ++ под VS2010
Решение
При условии, что hash
Вот std::hash
, нет специализации std::hash
для char*
или wchar*
Кроме общей специализации для любого типа указателя, этот хэси на основе значения указателя.
Итак, если вы хотите использовать TCHAR*
В качестве хеш-ключа, с хешем на основе строкового содержимого вместо значения указателя, вам нужно будет поставлять другой класс хеш-функтора.
Есть специализации std::hash
для string
а также wstring
, что я думаю, что вы могли бы использовать, если вы выбрали правильный в соответствии с _UNICODE
. Отказ Я говорю «Я думаю», потому что Thar * должен просто преобразовать в string
или wstring
, но если я что-то пропустил, то вы могли бы написать простую обертку.
Если бы вы собирались сделать один из них, хотя, вы могли бы просто использовать string
или wstring
Как хеш-ключ, поскольку все нужно будет преобразовать для хеширования в любом случае. Это также позволит вам добавлять строки в ваш Unuported_set, не позволяя им повесить, пока они не будут не удалены. С вашим кодом, я представляю, это неприятность, добавляя что-то кроме строковых литералов на множество.
Если вы беспокоитесь о скорости, и не беспокоитесь о управлении струнами, затем выберите свой любимый алгоритм хеширования String и примените его к строковым данным.