【问题标题】:Efficient pointer to integer mapping and lookup in C++在 C++ 中指向整数映射和查找的有效指针
【发布时间】:2011-04-07 18:02:43
【问题描述】:

我想将指针映射到整数以进行序列化。指针可能是不同的类型,并且可能指向可能使用多重继承的多态对象。我需要查询地图以了解指针是否存储在其中,如果是,那么关联的整数值是多少。

正确的做法是什么?

我想到的map<void*, int> 的简单方法行不通,因为operator < 没有为任意指针定义。或者这不是常见系统的问题吗?

另一种解决方案是使用vector<void*>。但这需要循环存储在其中的所有指针,我不确定转换为void * 是否不会破坏使用继承的对象的operator ==

【问题讨论】:

  • “我认为不会工作,因为运算符
  • 您考虑过使用库吗?示例:s11.net 或 boost.serialization
  • 是的,我考虑过使用 boost::serialization,但它需要一些调整才能用于我的数据。
  • 如果你想要效率,你可以看看 boost::unordored_map 我认为它应该更好,但我还没有看。

标签: c++ pointers map


【解决方案1】:

您可以将 unsigned int32/64 映射到 int(取决于 x86 或 x64)。只需将 void* 转换为 unsigned int,它就会很乐意进行比较。

【讨论】:

  • 好的,我可以将指针转换为 size_t 以确保它适合,但这不会在使用继承时改变指针的相等性吗?
  • 这样做不是什么好主意。它看起来更像是一个黑客!如果你遵循这一点,请确保你记录得很好!。
  • 请至少使用 intptr_t 或 uintptr_t,这些都是有原因的。
【解决方案2】:

您对使用map<void*, int> 的最初想法很幸运。
虽然operator< 没有为指针定义是对的,但std::map<> 使用的谓词是std::less<>,C++ 标准要求std::less<T*> 也适用于任意指针。

引用 C++ 标准来支持这一点([lib.comparisons]/8):

对于模板greaterlessgreater_equalless_equal,任何指针类型的特化产生一个总顺序,即使内置运算符<>、@987654332 @, >= 不要。

【讨论】:

  • 我对此表示怀疑:对此有任何参考
  • 用支持引用更新了我的答案。
【解决方案3】:
【解决方案4】:

为什么不简单地为所有可序列化类引入一个虚拟基类?

class Serializable
{
};

map< Serializable *, int > integralMap;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 2022-10-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多