为什么标准的关联有序容器将“ const char *”作为其键?

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, setconst 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*),为什么这里甚至没有警告?

Nat*_*ica 8

键的默认运算符是<operator。

这不是真的。未哈希的关联容器的默认比较运算符为std::lessstd::less采用operator <了比较,但有一个关键的区别。不同于内置在operator <哪里的指针

两个指针都不要求比另一个更大。

资源

std::less 有那个

对于任何指针类型特殊化收率也就是那些特例中是一致的,并且也与由所施加的偏序相一致的严格总订单内置运营商<><=>=

资源

因此这是一种安全的操作,我们可以在地图中可靠地存储指针。