为什么我不能同时使用std :: unordered_map和boost :: unordered_map与boost :: multiprecision类型?

时间:2015-08-18 21:22:21

标签: c++ boost stl unordered-map multiprecision

我正在尝试使用STL类型创建boost(或unordered_mapboost::mulprecision,例如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);
                                  ^

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

修改

question of which this might be a duplicate使用{1.5}中添加的boost::multiprecision序列化支持(至少根据文档@1.55@1.56的差异。< / p>

此外,在该问题中,如果没有boost::multiprecision中的序列化支持,则没有其他方法可以解决此问题。

1 个答案:

答案 0 :(得分:3)

您的“question of which this might be a duplicate”会记录问题本身的工作技巧 - 对字符串表示进行哈希处理:

var datatable = google.visualization.arrayToDataTable([
   ['', '', { role: 'style' }, { role: 'annotation'}],
    ['Billable Time', parseFloat(gettimevalue(data.BillableTime)), 'color: #ADCEE7', data.BillableTime],
    ['Effort Time', parseFloat(effortTime), 'color: #F0CA54',effortTime],
    ['Punch Time', parseFloat(punchTime), 'color: #A8C74A',punchTime]
  ]); 

注意:

  • 我不知道#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()的不同值会因此哈希会相同哈希表中的桶,它不会破坏功能,但会从O(1)转向O(N)性能。因此,如果默认情况下str()没有显示完整的精度,但是有一种方法可以强制它,那么如果你处理的是很多不同的值,那将是一个好主意。

  • 与浮点类型作为键的所有用法一样,要小心,因为微小的舍入差异可能导致现有的映射条目无法找到/匹配,因此意外的“重复”等等。

你的程序太慢配置文件证明哈希是原因,然后担心替代方案或升级提升....