Насколько я знаю, мы никогда не должны сравнивать две строки константных символов, используя реляционные операторы <>
... потому что факт, что он сравнивает адреса, а не значения:
const char* sz1 = "Hello";
const char* sz2 = "hello";
if(sz1 < sz2);// not valid. So use strcmp instead.
- Что я заметил, что упорядоченные ассоциативные контейнеры, такие как
map, multimap, set, multiset
, накладывают ограничение на их key
, так что ключ должен каким-то образом сравниваться для упорядочения элементов в контейнере. Оператором по умолчанию для ключа является <
operator.
Все понятно, пока я не создаю map, set
из const char*
, тогда я получаю неверные результаты:
std::set<const char*> scp{ "Hello", "World", "C++", "Programming" };
std::set<std::string> sstr{ "Hello", "World", "C++", "Programming" };
// error
std::copy(scp.cbegin(), scp.cend(), std::ostream_iterator<const char*>(std::cout, " "));
std::cout << std::endl;
// Ok
std::copy(sstr.cbegin(), sstr.cend(), std::ostream_iterator<std::string>(std::cout, " "));
std::cout << std::endl;
Очевидно, что scp
сравнивает указатели со строками символов, в то время как sstr
в порядке, пока класс string
определил <
для правильной работы.
Почему STL позволяет это? (создание ассоциативных контейнеров с типом ключевого элемента char*
) и почему здесь даже нет предупреждений?