据我所知,C ++定义 map<a,b>::value_type
如 pair<const a,b>
如果我在地图中使用指针类型作为键类型会发生什么,即
std::map<const char*,int>::value_type::first_type = const char*
正如我对上面的定义所期望的那样
std::map<const char*,int>::value_type::first_type = const char* const
因为更合乎逻辑(因为否则我将被允许从地图迭代器中更改键值)?
你的推理是正确的, value_type::first
将会 char const * const
。
思考这个问题有一个共同的混乱来源 const T
什么时候 T
是一个 type *
是 const type *
,但事实并非如此。与宏不同, typedef
s不是文本替换,也不是模板参数。当你这样做 const T
如果 T
是一个 typedef
或模板参数,你要添加一个 const
到整个类型。
这就是我喜欢写我的原因之一 const
在该类型的右侧,因为它减少了混淆: T const *
,添加一个额外的const,得到 T const * const
。
如果 a
是 const char*
, 然后 const a
确实是 const char* const
。
您的评估是正确的,但您必须非常小心这种方法有两个原因:
- 您必须提供一个自定义比较器谓词,该谓词执行const char *的正确排序(例如,使用strcmp的变体,如果key1 <key2,则仅返回true)。如果你不这样做,你的字符串将按指针值排序,这几乎总是不是你想要的。
- 您必须考虑地图中键的生命周期以及在销毁地图时如何释放它们。