Документация hash_map, на которую вы ссылаетесь, указывает, что вы можете указать свой собственный класс черт в качестве третьего параметра шаблона. Это должно соответствовать тому же интерфейсу, что и hash_compare .
Сканируя документы, я думаю, что то, что вам нужно сделать, это то, что в основном заменяет использование StringComparer.OrdinalIgnoreCase
, которое вы использовали в своем словаре:
struct my_hash_compare {
const size_t bucket_size = 4;
const size_t min_buckets = 8;
size_t operator()(const LPCWSTR &Key) const {
// implement a case-insensitive hash function here,
// or find something in the Windows libraries.
}
bool operator()(const LPCWSTR &Key1, const LPCWSTR &Key2) const {
// implement a case-insensitive comparison function here
return _wcsicmp(Key1, Key2) < 0;
// or something like that. There's warnings about
// locale plastered all over this function's docs.
}
};
Я обеспокоен тем, что в документах говорится, что функция сравнения должна быть полным порядком, а не строгим слабым порядком, как обычно для отсортированных контейнеров в стандартных библиотеках C ++. Если MS действительно означает общий порядок, то hash_map может полагаться на то, что он соответствует operator==
. То есть они могут потребовать, чтобы, если my_hash_compare()(a,b)
было ложным, а my_hash_compare()(b,a)
ложным, то a == b
. Очевидно, это не относится к тому, что я написал, и в этом случае вам не повезло.
В качестве альтернативы, которая в любом случае, вероятно, более эффективна, вы можете нажать все ключи в общем случае, прежде чем использовать их на карте. Сравнение без учета регистра более затратно, чем обычное сравнение строк. Есть какой-то юникод, связанный с тем, что я никогда не смогу вспомнить. Возможно, вам нужно преобразовать -> нижний регистр -> верхний регистр, а не просто -> верхний регистр или что-то в этом роде, чтобы избежать некоторых неприятных случаев на определенных языках или с символами заглавных букв. Кто-нибудь?
Также, как говорили другие люди, вы, возможно, не хотите, чтобы LPCWSTR использовался в качестве ключа. Это будет хранить указатели на карте, что означает, что любой, кто вставляет строку, должен убедиться, что данные, на которые он указывает, остаются действительными, пока они находятся в hash_map. В долгосрочной перспективе часто лучше, чтобы hash_map сохранял копию строки ключа, переданной в insert
, и в этом случае вы должны использовать wstring
в качестве ключа.