Есть ли проблема с использованием строки C в качестве ключа карты?
std::map<const char*, int> imap;
Порядок элементов на карте не имеет значения, поэтому нормально, если они упорядочены с помощью std::less<const char*>
.
Я использую Visual Studio и в соответствии с MSDN (для Microsoft):
В некоторых случаях идентичные строковые литералы могут быть "объединены" для экономии места в исполняемом файле. При объединении строковых литералов компилятор заставляет все ссылки на определенный строковый литерал указывать на одно и то же место в памяти вместо того, чтобы каждая ссылка указывала на отдельный экземпляр строкового литерала.
В нем говорится, что они объединены в пул только в некоторых случаях, поэтому кажется, что доступ к элементам карты с использованием строкового литерала был бы плохой идеей:
//Could these be referring to different map elements?
int i = imap["hello"];
int j = imap["hello"];
Можно ли перегрузить operator==
для const char*
, чтобы для определения равенства элементов карты использовалась фактическая строка C, а не значения указателя:
bool operator==(const char* a, const char* b)
{
return strcmp(a, b) == 0 ? true : false;
}
Всегда ли полезно использовать строку C в качестве ключа карты?