Ita*_*iwa 2 c++ stl stdmap stdset
据我所知,我们绝不应该使用关系运算符来比较两个const字符串<>。因为它比较地址而不是值:
const char* sz1 = "Hello";
const char* sz2 = "hello";
if(sz1 < sz2);// not valid. So use strcmp instead.
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
显然,只要类已定义为可以正常工作,就可以scp将指向指针的字符串比较sstr为OK 。string<
为什么STL允许这样做?(创建键元素类型为的关联容器char*),为什么这里甚至没有警告?