J'ai regardé les constructeurs de unordered_set. Est-ce qu'il n'est pas possible de construire un unordered_set avec une instance d'allocateur personnalisée SANS définir le nombre de segments de hachage? Je préfère vraiment ne pas jouer avec les détails d'implémentation parce que je veux un allocateur personnalisé, et le type ne fournit aucune définition pour la valeur par défaut. MSDN donne seulement trois surcharges pour le constructeur, dont aucune n'est terriblement utile.std :: constructeurs unordered_set
Editer: Merde sacrée. Mon implémentation STL de std :: hash ne se spécialise pas pour les chaînes avec un type d'allocateur personnalisé - elle ne peut faire que les typedefs explicites std :: string et std :: wstring. Je veux dire, je peux comprendre ne pas vouloir essayer de hacher les chaînes de caractères aléatoires, mais juste parce qu'il a un allocateur personnalisé? Cela me dégoûte.
tokens(std::unordered_set<string>().bucket_count(), std::hash<string>(), std::equal_to<string>(), stl_wrapper::hash_set<string>::allocator_type(this))
template<typename Char, typename CharTraits, typename Allocator> class std::hash<std::basic_string<Char, CharTraits, Allocator>>
: public std::unary_function<std::basic_string<Char, CharTraits, Allocator>, std::size_t> {
public:
size_t operator()(const std::basic_string<Char, CharTraits, Allocator>& ref) const {
return std::hash<std::basic_string<Char, CharTraits>>()(std::basic_string<Char, CharTraits>(ref.begin(), ref.end()));
}
};
Résout les problèmes, mais les constructions redondantes et la copie? Ewwwww.
En ce qui concerne votre édition: yup, j'ai peur. 'std :: hash 'fait un peu défaut, en particulier je pense que la norme devrait fournir une fonction pour hacher une séquence d'octets, pour la rendre plus facile à spécialiser pour les UDT (y compris votre chaîne avec l'allocateur personnalisé). Mais puisque votre chaîne alternativement allouée n'est pas liée à l'une des spécialisations obligatoires de 'hash', vous êtes SOOL sans aide en vue. Je pense que vous devez simplement choisir votre propre algorithme de hachage, puis écrire une spécialisation ou spécifier le hachage dans votre conteneur. –
@Steve: Pas tout à fait. Les constructeurs basic_string peuvent prendre n'importe quel itérateur, donc il n'était pas vraiment difficile de l'étendre à l'agnostic allocator, mais cela implique une copie redondante, ce qui me fait RAEG. – Puppy
@DeadMG: oui, selon la raison pour laquelle vous utilisez un allocateur personnalisé. Si vous voulez que * all * allocation dans votre programme passe par votre allocateur, alors ce n'est pas seulement une copie redondante, c'est l'échec total. –