2017-01-29 22 views
0

Я пытаюсь использовать функтор с определяемым состоянием как хешер для неупорядоченного_set, проблема, с которой я столкнулся, - это я не знаю, как инициализировать функтор, переданный как параметр шаблона. Это было бы так.Использование функтора с определяемым состоянием как неупорядоченная хэш-функция

class A{ 
    private: 
     class Hasher{ 
      private: 
       int a; 
      public: 
       Hasher(int val=3):a(val){}; 
       size_t operator()(const string & s) const{ 
        return s[0]*a; 
       } 
     }; 
     unordered_set<string,Hasher??> us; 
     int hasher_val; 

    public: 
     A(int h_val):hasher_val(h_val){}; 
} 

Проблема в том, как определить «a» для значения, отличного от 3?

ответ

1

std::unordered_set «s constructor has optional parameters, который может быть использован для инициализации его хэш-экземпляр:

unordered_set<string,Hasher> us; 
    int hasher_val; 

public: 
    A(int h_val) : us{51, Hasher(4)}, hasher_val{h_val}{}; 

Один немного неудобным фактом является то, что экземпляр хэш является вторым параметром, и вы должны явно указать размер хэш ведра, вместо того, чтобы полагаться на мудрость вашей библиотеки C++ для обеспечения подходящего значения по умолчанию (в моем примере я просто взял 51 с головы, что, вероятно, очень и очень неправильно, но это был бы другой вопрос, который нужно обдумать. .).

Вы должны потратить несколько минут на поиск файлов заголовков, чтобы определить, что использует ваша реализация C++ по умолчанию для размера набора и задавать одинаковое значение.

P.S. Тот же подход используется со всеми библиотечными контейнерами: все параметры их конструкторов дефолтны, что позволяет явно их построить, используя специальный экземпляр класса хеширования, экземпляр класса специализированного компаратора и т. Д.

+0

Согласно http: /stackoverflow.com/a/14182624/3313064, вы можете просто передать 0 или получить кол-во по умолчанию по умолчанию из другого экземпляра. –

+0

Спасибо большое! Это именно то, что я искал, например, @ christian-hackl указал, что документация предполагает, что значение 0 - идеальное значение в размере начального ковша, спасибо тоже. – user3325504