使用指针作为键的地图的value_type

11
据我所知,C++将map<a,b>::value_type定义为pair<const a,b>
如果我在map中使用指针类型作为键类型,会发生什么情况?即:
std::map<const char*,int>::value_type::first_type = const char*

正如我从上面的定义所期望的,或者

std::map<const char*,int>::value_type::first_type = const char* const
更加合理的做法是什么(否则我将允许从映射迭代器中更改键值)?

考虑使用 std::string 替代。 - nikhil
3个回答

11
你的推理是正确的,value_type::first 将会是 char const * const
在认为 Ttype * 时,常见的混淆源是认为 const Tconst type *,但实际上并非如此。与宏定义不同,typedef 和模板参数并非文本替换。当你使用 const T 时,如果 T 是一个 typedef 或模板参数,则会将 const 添加到整个类型中。
这就是为什么我喜欢将我的 const 写在类型的右边,因为这样会减少混淆: T const *,再添加一个 const,就会得到 T const * const

这真是令人宽慰。我想我们应该在新程序员中推广使用const type而不是type const的约定,这将避免在type为指针的情况下产生混淆。 - pqnet

2
如果aconst char*,那么const a实际上是const char* const

0

你的判断是正确的,但是这种方法有两个需要注意的地方:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接