为 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>>>>>;