私はunordered_setのコンストラクタを見てきました。ハッシュバケットの数を設定せずにカスタムアロケータインスタンスでunordered_setを構築することはできませんか?カスタムアロケータが必要なので実装の詳細を混乱させるのではなく、その型はデフォルト値の定義を提供しません。 MSDNはコンストラクタのために3つのオーバーロードしか与えませんが、どれも非常に便利です。std :: unordered_setコンストラクタ
編集:Holy Crap。 std :: hashのSTL実装はカスタムアロケータ型の文字列に特化しません。std :: stringとstd :: wstringの明示的なtypedefsしか実行できません。つまり、ランダムな文字列をハッシュしようとするのではなく、カスタムアロケータがあるからといって理解できますか?これは私を嫌にする。
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()));
}
};
問題は解決しますが、冗長な構成とコピーはありますか? Ewwwww。
あなたの編集に関して:yup、恐れるほど。 'std :: hash'は少し欠けています。特に、標準では、UDT(カスタムアロケータであなたの文字列を含む)をより簡単にするために、バイトシーケンスをハッシュする関数を標準で提供する必要があります。しかし、交互に割り当てられた文字列は、強制された 'ハッシュ'特殊化のいずれにも関連していないので、あなたはSOOLであり、助けにはなりません。 AFAIKを使用するには、独自のハッシュアルゴリズムを選択してから、特殊化を作成するか、コンテナにハッシュを指定するだけです。 –
@スティーブ:まあまあです。 basic_stringコンストラクタは反復子をとることができるので、実際にはアロケータに依存しないように拡張することは非常に困難ではありませんでしたが、冗長コピーが必要なため、RAEGになりました。 – Puppy
@DeadMG:なぜ、あなたがカスタムアロケータを使用しているのかによる。あなたのプログラムの* all *割り当てがあなたのアロケータを通過するようにしたいのであれば、それは単なる冗長コピーではなく、完全に失敗します。 –