为 Boost 的 `cpp_dec_float_100` 提供分配器
Providing an allocator for Boost's `cpp_dec_float_100`
我有一个数据集以 .root
文件格式(来自 CERN ROOT
框架)存储为 cpp_dec_float_100
类型(来自 boost::multiprecision
库)。此数据被读入 std::vector<cpp_dec_float_100>
。默认情况下,cpp_dec_float_100
未分配。如果我尝试按原样将此数据读入向量,则会抛出 std::bad_alloc
。所以,我接受了 Boost 文档的建议并提供了一个通用分配器,它似乎解决了这个问题(并且似乎将生成的向量的大小减半)。
最终,我想将此向量作为参数传递给我编写的函数,该函数对向量执行二进制搜索以找到该向量中最接近给定值的元素:
#include <boost/multiprecision/cpp_dec_float.hpp>
using Mult_t = boost::multiprecision::cpp_dec_float<100, int, allocator<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>>>>;
std::vector<Mult_t>::iterator search(std::vector<Mult_t> &vec, Mult_t value){
auto it = lower_bound(vec.begin(), vec.end(), value);
if(it != vec.begin()){
if(abs(value - *(it - 1)) < abs(value - *it)){
--it;
}
}
return it;
}
我正在使用“别名”Mult_t
,因为替代方案有点冗长。
因此,给定向量 vec
和值 val
,这将找到 vec
中最接近 val
的元素。
如果我按原样使用 cpp_dec_float_100
类型(即 Mult_t = boost::multiprecision::cpp_dec_float_100
),效果很好。但是,当我尝试提供分配器时,出现错误:
In module 'std' imported from input_line_1:1:
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/bits/stl_algobase.h:965:18: error: invalid operands to binary expression ('boost::multiprecision::backends::cpp_dec_float<100, int,
std::allocator<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100,
int, void>, boost::multiprecision::expression_template_option::et_on> > >' and 'const
boost::multiprecision::backends::cpp_dec_float<100, int,
std::allocator<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100,
int, void>, boost::multiprecision::expression_template_option::et_on> > >')
if (*__middle < __val)
我不太明白这里发生了什么(我严重怀疑它与分配器有任何关系),并且错误消息不是很有见地。
你的问题与分配器无关,只是因为cpp_dec_float<...>
没有operator<()
,只有number<cpp_dec_float<...>>
支持。
您应该将 Mult_t
重新定义为:
using namespace boost::multiprecision;
using Mult_t = number<
cpp_dec_float<100, int, std::allocator<number<cpp_dec_float<100>>>>>;
我有一个数据集以 .root
文件格式(来自 CERN ROOT
框架)存储为 cpp_dec_float_100
类型(来自 boost::multiprecision
库)。此数据被读入 std::vector<cpp_dec_float_100>
。默认情况下,cpp_dec_float_100
未分配。如果我尝试按原样将此数据读入向量,则会抛出 std::bad_alloc
。所以,我接受了 Boost 文档的建议并提供了一个通用分配器,它似乎解决了这个问题(并且似乎将生成的向量的大小减半)。
最终,我想将此向量作为参数传递给我编写的函数,该函数对向量执行二进制搜索以找到该向量中最接近给定值的元素:
#include <boost/multiprecision/cpp_dec_float.hpp>
using Mult_t = boost::multiprecision::cpp_dec_float<100, int, allocator<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>>>>;
std::vector<Mult_t>::iterator search(std::vector<Mult_t> &vec, Mult_t value){
auto it = lower_bound(vec.begin(), vec.end(), value);
if(it != vec.begin()){
if(abs(value - *(it - 1)) < abs(value - *it)){
--it;
}
}
return it;
}
我正在使用“别名”Mult_t
,因为替代方案有点冗长。
因此,给定向量 vec
和值 val
,这将找到 vec
中最接近 val
的元素。
如果我按原样使用 cpp_dec_float_100
类型(即 Mult_t = boost::multiprecision::cpp_dec_float_100
),效果很好。但是,当我尝试提供分配器时,出现错误:
In module 'std' imported from input_line_1:1:
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/bits/stl_algobase.h:965:18: error: invalid operands to binary expression ('boost::multiprecision::backends::cpp_dec_float<100, int,
std::allocator<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100,
int, void>, boost::multiprecision::expression_template_option::et_on> > >' and 'const
boost::multiprecision::backends::cpp_dec_float<100, int,
std::allocator<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100,
int, void>, boost::multiprecision::expression_template_option::et_on> > >')
if (*__middle < __val)
我不太明白这里发生了什么(我严重怀疑它与分配器有任何关系),并且错误消息不是很有见地。
你的问题与分配器无关,只是因为cpp_dec_float<...>
没有operator<()
,只有number<cpp_dec_float<...>>
支持。
您应该将 Mult_t
重新定义为:
using namespace boost::multiprecision;
using Mult_t = number<
cpp_dec_float<100, int, std::allocator<number<cpp_dec_float<100>>>>>;