У меня есть std::map<string, string>
с пользовательским предикатом:
struct PredIgnoreCase {
bool operator()(const std::string& str1, const std::string& str2) const {
std::string str1NoCase(str1), str2NoCase(str2);
std::transform(str1.begin(), str1.end(), str1NoCase.begin(), tolower);
std::transform(str2.begin(), str2.end(), str2NoCase.begin(), tolower);
return (str1NoCase < str2NoCase);
}
};
Сейчас дано
typedef std::map<std::string, std::string> DIRECTORY_WITHCASE;
typedef std::map<std::string, std::string, PredIgnoreCase> DIRECTORY_NOCASE;
Я инициализирую
// Case-sensitive directory: case of string-key plays no role
DIRECTORY_WITHCASE dirCaseSensitive{
make_pair("John", "2345764"),
make_pair("JOHN", "2345765"),
make_pair("Sara", "42367236"),
make_pair("Jack", "32435348"),
};
И затем, когда я инициализирую
DIRECTORY_NOCASE dirCaseInsensitive(dirCaseSensitive.begin(),
dirCaseSensitive.end());
dirCaseInsensitive
печатает
Jack - >32435348
JOHN - >2345765 <---- John in upper case
Sara - >42367236
Однако, если я инициализирую dirCaseInsensitive
как:
DIRECTORY_NOCASE dirCaseInSensitive{
make_pair("John", "2345764"),
make_pair("JOHN", "2345765"),
make_pair("Sara", "42367236"),
make_pair("Jack", "32435348"),
};
Он выводит правильную карту:
Jack - >32435348
John - >2345764 <----- John in lower case
Sara - >42367236
Почему разные конструкторы одной и той же карты дают разные результаты?