为什么我既不能将 std::unordered_map 也不能将 boost::unordered_map 与 boost::multiprecision 类型一起使用?

Why I cannot use neither std::unordered_map nor boost::unordered_map with boost::multiprecision types?

我正在尝试使用 boost::mulprecision 类型创建 STL(或 boostunordered_map,例如cpp_intgcc 在尝试将元素插入此容器后抛出错误。

#include <boost/multiprecision/cpp_int.hpp>
#include <boost/unordered_map.hpp>

using namespace boost::multiprecision;

int main()
{
  cpp_int z(123123123);
  cpp_int x(123123123);

  boost::unordered_map<cpp_int, cpp_int> data;

  // line below will throw compilation errors
  //data.insert(std::make_pair(z,x));
  return 0;
}

完整的错误日志是 here

第一个错误:

In file included from /usr/include/boost/functional/hash/hash.hpp:529:0,
                 from /usr/include/boost/functional/hash.hpp:6,
                 from /usr/include/boost/unordered/unordered_map.hpp:20,
                 from /usr/include/boost/unordered_map.hpp:16,
                 from main.cpp:2:
/usr/include/boost/functional/hash/extensions.hpp: In instantiation of
  ........
main.cpp:13:34:   required from here
/usr/include/boost/functional/hash/extensions.hpp:269:34: error: no matching function for call to ‘hash_value(const boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<> >&)’
             return hash_value(val);
                                  ^

关于 boost 的多精度类型,STL/boost 容器使用是否有限制? 我正在使用 boost 1.54.

编辑:

uses boost::multiprecision's serialization support which has been added in boost 1.56 (at least according to differences in docs @1.55 and @1.56

此外,在那个问题中,boost::multiprecision.

中没有提到在没有序列化支持的情况下解决此问题的其他方法。

你的“”记录了问题本身的一种工作技术——散列字符串表示:

#include <boost/multiprecision/cpp_int.hpp>
#include <boost/unordered_map.hpp>

using namespace boost::multiprecision;

template <typename T>
struct hash_str
{
    size_t operator()(const T& t) const { return std::hash<std::string>()(t.str()); }
};

int main()
{
  cpp_int z(123123123);
  cpp_int x(123123123);

  boost::unordered_map<cpp_int, cpp_int, hash_str<cpp_int>> data;

  data.insert(std::make_pair(z,x));
}

备注:

  • 我不知道 cpp_int::str() 是否输出类型存储的完整精度,但如果不是,那么不同的值会产生相同的 str(),因此哈希将在哈希 table 中的同一个桶中发生碰撞,这不会破坏功能,但会从 O(1) 转向 O(N) 性能。因此,如果默认情况下 str() 不显示完全精度但有一种方法可以强制它,那么如果您处理许多差异非常小的值,那将是个好主意。

  • 与所有使用浮点类型作为键的情况一样,要小心,因为微小的舍入差异会导致现有映射条目不是 found/matched,从而导致意外的 "duplicates" 等..

你的程序太慢了并且配置文件证明散列是原因,然后担心替代品或升级提升.. ..