Я попытался перейти с std::unordered_map (VS2010) на boost::unordered_map (версия 1.48), и, что удивительно, некоторые важные тестовые примеры в моем проекте не удались. Я выследил причину и пришел к выводу, что boost::unordered_map не учитывает мой провайдер равенства, нечувствительный к регистру:
struct StringEqualityCaseInsensitive : public std::equal_to<String>
{
bool operator ()(const String& a, const String& b) const { return boost::iequals<String, String>(a, b); }
};
boost::unordered_map<string, int, boost::hash<string>, StringEqualityCaseInsensitive> map;
Теперь я просто добавляю некоторые элементы в верхнем регистре и ищу их аналоги в нижнем регистре (используя метод члена find()). Если я использую std::unordered_map, он работает нормально, а с повышением - нет. Жестокая вещь заключается в том, что если я ищу элементы в верхнем регистре, вызывается компаратор равенства, а когда я ищу строчные буквы, он не вызывается...
У кого-нибудь есть ключ, почему это? (Не уверен, что это важно, но я использую Intel Compiler 12.1 с включенной поддержкой C++0x)
РЕДАКТИРОВАТЬ: Блин, теперь до меня доходит. Возможно, мне нужно также настроить хеш-класс, чтобы он возвращал одно и то же значение независимо от нижнего/верхнего регистра. Но все же странно, что у них разное поведение?!
Спасибо!