Providing an allocator for Boost’s `cpp_dec_float_100`

  allocator, boost, c++

I have a dataset stored in .root file format (from the CERN ROOT framework) as type cpp_dec_float_100 (from the boost::multiprecision library). This data is read into an std::vector<cpp_dec_float_100>. By default, cpp_dec_float_100 is unallocated. If I were to try to read this data into a vector as-is, an std::bad_alloc is thrown. So, I’ve taken the advice of the Boost docs and provided a generic allocator, which seems to solve the issue (and appears to cut the size the resulting vector in half).

Ultimately, I want to pass this vector as an argument to a function that I’ve written, which performs binary search on a vector to find the element of that vector closest to a given value:

#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;
}

I’m using the "alias" Mult_t as the alternative is a bit of a mouthful.

So, given the vector vec and the value val, this finds the element in vec nearest to val.


If I use the cpp_dec_float_100 type as-is (i.e. Mult_t = boost::multiprecision::cpp_dec_float_100), this works great. However, when I attempt to provide an allocator, I’m given the error:

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)


I don’t quite understand what’s going on here. This is admittedly something I’m not terribly familiar with (I’ve effectively just copied and pasted what’s given in the Boost docs), and the error message isn’t especially insightful.

Thanks in advance!

Source: Windows Questions C++

LEAVE A COMMENT