为什么我既不能将 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
(或 boost
)unordered_map
,例如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);
^
关于 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" 等..
你的程序太慢了并且配置文件证明散列是原因,然后担心替代品或升级提升.. ..
我正在尝试使用 boost::mulprecision
类型创建 STL
(或 boost
)unordered_map
,例如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);
^
关于 boost
的多精度类型,STL
/boost
容器使用是否有限制?
我正在使用 boost 1.54.
编辑:
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" 等..
你的程序太慢了并且配置文件证明散列是原因,然后担心替代品或升级提升.. ..