Con un tipo regolare, intendo la definizione di Stepanov in Elementi di programmazione, in sostanza, che esiste il concetto di uguaglianza e che gli oggetti che sono copie l'uno dell'altro sono uguali.C++ 11: Ci sono ragioni per cui alcuni tipi regolari non dovrebbero avere `std :: hash` specializzato?
Quindi, quando si dispone di un tipo regolare T
, e il rapporto uguaglianza è transitiva (a == b & & b == c => a == c), è possibile definire una (non banale) funzione di hash che è coerente con la definizione di uguaglianza (a == b => h (a) == h (b)). Sempre.
Ma lo standard non include molte specializzazioni std::hash
. Per esempio. std::complex
non ne ha uno e nessuno dei due ha i contenitori, con le notevoli eccezioni di vector<bool>
e bitset
.
Quindi mi chiedo quale sia il principio di progettazione qui.
Oppure, chiesto in modo diverso: ci sono motivi per non fornire specializzazioni std::hash
per i propri tipi, a condizione che siano regolari e che l'uguaglianza sia transitiva?
Certo, è sempre possibile definire una funzione di hash coerente: 'size_t operator() (T & const) const {return 0; } 'La domanda è, puoi sempre definire quella che è buona per un tipo arbitrario? – Barry
'vector' non è implementato come 'vector' di' bool's. È una specializzazione di template che si basa su 'int' per salvare diversi' bool's (suppongo 32). È invariante rispetto a tutti i parametri del template (e ai tipi sottostanti ''std :: hash'), penso che sia il motivo per cui viene fornita una specializzazione. –
mike
Nella libreria standard vi sono diversi tipi che hanno [richieste permanenti aperte] (https://cplusplus.github.io/LWG/lwg-active.html#1025) per specializzare 'std :: hash' – CoryKramer