Сравнения
Таким образом, при использовании в качестве ключей C-строк ассоциативные контейнеры будут работать не так, как ожидало бы большинство людей.
И дело не только в определении операции "меньше", а еще и в том, что char* не стоит использовать в качестве элементов STL контейнеров вообще: контейнер будет содержать значение указателя -- не содержимое строки, как кто-то по наивности мог полагать. Например, следующая функция содержит серьезную ошибку: void f(set<char*>& cset) { for (;;) { char word[100];
// считываем слово в word ...
cset.insert(word); // ошибка: вставляем один и тот же указатель // на локальную переменную } }
Для получения ожидаемого результата следует использовать string: void f(set<string>& cset) { for (;;) { char word[100];
// считываем слово в word ...
cset.insert(word); // OK: вставляем string } }
Использование char* в STL контейнерах приводит к чрезвычайно коварным ошибкам, т.к. иногда все работает правильно. Например документация к sgi STL широко использует char* в своих учебных примерах: struct ltstr { bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) < 0; } };
int main() { const int N = 6; const char* a[N] = {"isomer", "ephemeral", "prosaic", "nugatory", "artichoke", "serif"};
set<const char*, ltstr> A(a, a + N);
// и т.д. }
Данный пример вполне корректен, но стоит только вместо статически размещенных строковых литералов использовать локально формируемые C-строки, как неприятности не заставят себя ждать.
Относитесь скептически к учебным примерам!