我正在尝试使用STL
类型创建boost
(或unordered_map
)boost::mulprecision
,例如cpp_int
但gcc
在尝试向此容器插入元素后抛出错误。
#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
中的序列化支持,则没有其他方法可以解决此问题。
答案 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()
没有显示完整的精度,但是有一种方法可以强制它,那么如果你处理的是很多不同的值,那将是一个好主意。
与浮点类型作为键的所有用法一样,要小心,因为微小的舍入差异可能导致现有的映射条目无法找到/匹配,因此意外的“重复”等等。
你的程序太慢和配置文件证明哈希是原因,然后担心替代方案或升级提升....