据我所知,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 *,但事实并非如此。与宏不同, typedefs不是文本替换,也不是模板参数。当你这样做 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)。如果你不这样做,你的字符串将按指针值排序,这几乎总是不是你想要的。
- 您必须考虑地图中键的生命周期以及在销毁地图时如何释放它们。