关于c++中的map的key支持vector
这是我今天突然想到的一个问题,试了一下,c++ stl中的map是支持vector作为key的,而unordered_map默认是不支持vector作为key的,需要提供hash函数。
我一开始是对此有点诧异的,因为想到python中的dict的key必须是不可变对象才行。因为如果key被改变了,那就不能保证map容器中元素的有序性了。
后来稍微一想明白了。根本上是因为python,java等语言,因为其有gc,其根本上除了基本变量,都是引用语义的。所以一般的对象,即使放进了map中依然可以对key进行修改。而对于cpp,其在值语义上一路狂奔,不管是拷贝构造函数,移动构造函数,移动赋值函数等等这些其他语言没有的概念,都是由于cpp的值语义而不得不提出来的。cpp的目标就是让所有的对象的表现都如同int一样。因此,你把一个对象作为key装进map中(实际上是拷贝到map中),就没有机会再修改这个对象了(const 约束),因此cpp 的map的key不用像python的dict那样考虑对象的可变性。