unordered_set требований TCHAR *? - PullRequest
3 голосов
/ 25 ноября 2010

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

1 Ответ

1 голос
/ 25 ноября 2010

Предполагая, что hash здесь std::hash, специализация std::hash для char* или wchar* отсутствует, кроме общей специализации для любого типа указателя, который хэшируется на основе значения указателя.

Итак, если вы хотите использовать TCHAR* в качестве хеш-ключа, когда хеш-код основан на содержимом строки, а не на значении указателя, вам потребуется указать другой класс хеш-функтора.

Есть специализации std::hash для string и wstring, которые, я думаю, вы могли бы использовать, если выберете правильную согласно _UNICODE. Я говорю «я думаю», потому что TCHAR * следует просто преобразовать в string или wstring, но если я что-то пропустил, вы могли бы написать простую оболочку.

Однако, если вы собираетесь сделать что-то из этого, то вы также можете использовать string или wstring в качестве ключа хеширования, поскольку в любом случае все должно быть преобразовано для хеширования. Это также позволит вам добавлять строки в ваш unordered_set, не заставляя их висеть, пока они не будут удалены. С вашим кодом, представленным выше, я полагаю, что добавление в набор чего-либо, кроме строковых литералов, создает неудобства.

Если вы беспокоитесь о скорости и не беспокоитесь об управлении строками, выберите свой любимый алгоритм хеширования строк и примените его к строковым данным.

...