Z typem regularnym, mam na myśli definicję Stepanov w Elementy programowania, w zasadzie, że istnieje koncepcja równości i że obiekty, które są kopie siebie nawzajem porównać równe.C++ 11: Czy istnieją powody, dla których niektóre typy regularne nie powinny mieć specjalizacji `std :: hash`?
Więc kiedy masz Regularne Rodzaj T
oraz relacja równości jest przechodnia (a == b & & b == c => a == c), można zdefiniować (nietrywialne) funkcja skrótu zgodna z definicją równości (a == b => h (a) == h (b)). Zawsze.
Jednak standard nie obejmuje wielu specjalizacji std::hash
. Na przykład. std::complex
nie ma, ani nie ma kontenerów, z godnymi wyjątkami vector<bool>
i bitset
.
Zastanawiam się, jaka jest tutaj zasada projektowania.
Lub zapytano inaczej: czy istnieją powody, dla których nie należy udzielać specjalizacji std::hash
dla własnych typów, o ile są one regularne, a równość jest przechodnią?
Oczywiście, zawsze można zdefiniować funkcję skrótu, która jest spójna: 'size_t operator() (T & const) const {return 0; } 'Pytanie brzmi, czy zawsze możesz zdefiniować taki, który jest dobry dla dowolnego typu? – Barry
'wektor' nie jest zaimplementowany jako 'wektor'' bool's. Jest to szablon specjalizacji, która polega na 'int', aby zapisać kilka' bool's (zakładam 32). Jest niezmiennikiem wszystkich parametrów szablonu (i bazowych typów '' std :: hash'), dlatego właśnie specjalizacja jest zapewniona. –
mike
Istnieje wiele typów w standardowej bibliotece, które mają [stałe żądania otwarte] (https://cplusplus.github.io/LWG/lwg-active.html#1025), aby specjalizować 'std :: hash' – CoryKramer