C++ 3d.Комментарии

       

Сравнения


Таким образом, при использовании в качестве ключей 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-строки, как неприятности не заставят себя ждать.

Относитесь скептически к учебным примерам!



Содержание раздела