问题 value_type用于将指针作为键的映射


据我所知,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

因为更合乎逻辑(因为否则我将被允许从地图迭代器中更改键值)?


8568
2017-10-17 14:06


起源

考虑使用std :: string代替。 - nikhil


答案:


你的推理是正确的, 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


11
2017-10-17 14:18



这是缓解。我想我们应该扩散,尤其是新程序员之间的使用惯例 type const 代替 const type,这样可以避免混淆 type 是一个指针。 - pqnet


如果 a 是 const char*, 然后 const a 确实是 const char* const


2
2017-10-17 14:09





您的评估是正确的,但您必须非常小心这种方法有两个原因:

  1. 您必须提供一个自定义比较器谓词,该谓词执行const char *的正确排序(例如,使用strcmp的变体,如果key1 <key2,则仅返回true)。如果你不这样做,你的字符串将按指针值排序,这几乎总是不是你想要的。
  2. 您必须考虑地图中键的生命周期以及在销毁地图时如何释放它们。

0
2017-10-17 14:11



是的,通常这是一个常见的错误,但是在某些情况下你真的只想比较指针而不是字符串(例如:如果你有编译时间常量字符串作为键,如枚举的可打印版本,或者如果你'在winapi事件管理中从HWND到相对窗口处理对象制作地图) - pqnet