2010-07-26 3 views
1

Я хотел бы использовать строку * в качестве ключа в неупорядоченном списке. Я не хочу, чтобы хеш сам указатель, но строка, на которую он указывает.Использование строки * в качестве ключа в unordered_set

Я понимаю, что нужно создать-структуру, как это:

struct myhash{ 
    size_t operator()(const string * str){ 
     return hash(*str); 
    } 
} 

и отправить его как в Hasher в шаблоне карты, но я не знаю, как.

+3

Есть ли причина, вы должны использовать '' строку *, а не 'string'? Если вы используете 'string', то' unordered_list' будет корректно обрабатывать время жизни 'string'. Если вы используете 'string *', вам придется обрабатывать всю жизнь. Удостоверьтесь, что вы действительно получаете что-то от принятия этой задачи (управление жизненным циклом). –

+0

Если вы нашли ответ на свой вопрос, нажмите кнопку «Проверить». :) Кроме того, учтите, что сказал Макс: вам нужно управлять этими сроками жизни вручную, что плохо. (Так что это нормально, если указатели не владеют.) Если они владеют, используйте 'shared_ptr' или' unique_ptr'. – GManNickG

ответ

2

Это в основном это. Затем вы предоставляете его в качестве третьего параметра шаблона для типа unordered_map (который я буду считать C++ 0x). Я бы обобщить так что использовать в любой ситуации, а не просто string:

struct dereference_hash 
{ 
    template <typename T> 
    std::size_t operator()(const T* pX) 
    { 
     return std::hash<T>()(*pX); 
    } 
}; 

typedef std::unordered_map<std::string*, int, dereference_hash> map_type; 
+0

Спасибо, он работает. Небольшая поправка: return std :: hash (* pX); – izex

+0

@izex: Вы правы, я ошибаюсь, но вы имеете в виду 'std :: hash () (* pX)'? – GManNickG

+1

, конечно, я :-) – izex