在地图中插入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
}
的mpfr_t
类型不是一个简单的结构,在实际上,作为mpfr.h
头,它的大小为一的数组:
typedef __mpfr_struct mpfr_t[1];
这意味着,用户不能将其使用=
(简单地复制如同它在std::make_pair
中那样)。
最简单的解决方案是使用指向mpfr_t
的指针并将其存储在std::pair
(和std::map
)中。
谢谢,问题解决了:) – fabianschroeder
如果你使用C++,也许使用'mpfr_class'而不是'mpfr_t'?获得RAII的好处,所以你不会陷入手动管理内存,明确处理指针等。“mpfr_t”有点神奇,为了处理C的局限性,但是那些相同的魔法('typedef' - 大小为1 “mpft_t”结构数组)与C++的模板方案冲突,其中'mpfr_class'不会有这样的问题。 – ShadowRanger
谢谢,这解决了我的问题。 – fabianschroeder