【问题标题】:value_type for a map having pointers as key以指针为键的映射的 value_type
【发布时间】:2011-10-17 14:06:40
【问题描述】:

据我所知,C++ 将map<a,b>::value_type 定义为pair<const a,b>

如果我在map中使用指针类型作为键类型会发生什么,即is

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 代替。

标签: c++ stl map


【解决方案1】:

你的推理是正确的,value_type::first 应该是char const * const

Ttype *const type * 时,认为const T 是一个常见的混淆来源,但事实并非如此。与宏不同,typedefs 不是文本替换,也不是模板参数。当您执行const T 时,如果Ttypedef 或模板参数,则您将const 作为一个整体添加到类型中。

这就是我喜欢将consts 写在类型右侧的一个原因,因为它可以减少混淆:T const *,添加一个额外的 const,得到T const * const

【讨论】:

  • 那是缓解。我想我们应该传播,特别是在新程序员中,使用type const 而不是const type 的约定,这将避免在type 是指针的情况下混淆。
【解决方案2】:

如果aconst char*,那么const a 确实是const char* const

【讨论】:

    【解决方案3】:

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

    1. 您必须提供一个自定义比较器谓词,该谓词对 const char * 进行正确排序(例如,使用仅在 key1
    2. 您必须考虑映射中键的生命周期以及映射被销毁时如何释放它们。

    【讨论】:

    • 是的,通常这是一个常见的错误,但是在某些情况下,您真的只想比较指针而不是字符串(例如:如果您将编译时间常量字符串作为键,例如可打印枚举的版本,或者如果您在 winapi 事件管理中制作从 HWND 到相关窗口处理对象的映射)
    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 2014-09-27
    • 2015-07-18
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多