在地图中插入mpfr_t对象作为值

问题描述:

我遇到了将std :: pair,mpfr_t>类型的元素插入到地图中的麻烦。性病:: make_pair函数调用错误在地图中插入mpfr_t对象作为值

不兼容的类型“__mpfr_struct *”的分配“__mpfr_struct [1]”

因为我只是一个指针传递到mpfr_t对象我以为rec_func功能我可以使用*运算符对其进行取消引用,并将生成的mpfr_t作为值保存在地图中。

背景信息和代码结构:rec_func是一个递归函数。它应该计算某些情况。由于实例的数量非常大(10^50或更多),我正在使用数据类型mpfr_t。为了避免使用相同的参数不止一次地调用递归函数,我想使用动态编程(也就是Memoization)。为此,我使用一个带有三个整数的矢量作为关键字,并将mpfr_t作为值的映射。

主函数初始化一个map和mpfr_t类型的对象。然后它会在地图上调用rec_func和指针,并指向mpfr_t对象。因为mpfr_t实际上是一个数组类型,所以它不能被返回,因此我只是传递一个指向它的指针。

需要首先安装gmp和mfpr库。 命令和apt-get安装libgmp3-dev的 命令和apt-get安装libmpfr-dev的libmpfr-DOC libmpfr4 libmpfr4-DBG

意见将非常感激。

#include <map> 
#include <vector> 
#include <iostream> 
#include <gmp.h> 
#include <mpfr.h> 
using namespace std; 

void rec_func(std::map <std::vector<int>, mpfr_t>& my_map, mpfr_t* big_int) 
{ 

    int arr[3] = {1, 2, 3}; 
    std::vector<int> itm(arr, arr+3); 

    std::pair <std::vector<int>, mpfr_t> intr; 
    intr = std::make_pair(itm, *big_int); 
    //my_map.insert(intr); 

    //my_map.insert (std::make_pair(itm, *big_int)); 

} 

int main() 
{ 
    mpfr_t big_int; // initialize 
    mpfr_init2(big_int, 200); 
    mpfr_set_d(big_int, 1, MPFR_RNDN); // assign value 

    std::map <std::vector<int>, mpfr_t> my_map; 

    rec_func(my_map, &big_int); 

    mpfr_clear(big_int); // clear the big int 
    my_map.clear(); // delete the map 

} 
+0

如果你使用C++,也许使用'mpfr_class'而不是'mpfr_t'?获得RAII的好处,所以你不会陷入手动管理内存,明确处理指针等。“mpfr_t”有点神奇,为了处理C的局限性,但是那些相同的魔法('typedef' - 大小为1 “mpft_t”结构数组)与C++的模板方案冲突,其中'mpfr_class'不会有这样的问题。 – ShadowRanger

+0

谢谢,这解决了我的问题。 – f*schroeder

mpfr_t类型不是一个简单的结构,在实际上,作为mpfr.h头,它的大小为一的数组:

typedef __mpfr_struct mpfr_t[1];

这意味着,用户不能将其使用=(简单地复制如同它在std::make_pair中那样)。

最简单的解决方案是使用指向mpfr_t的指针并将其存储在std::pair(和std::map)中。

+0

谢谢,问题解决了:) – f*schroeder