Вопрос

Я хочу использовать структуру данных, которая служит как .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 и примените его к строковым данным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top