【问题标题】:insert mpfr_t object as value in a map在地图中插入 mpfr_t 对象作为值
【发布时间】:2016-12-23 15:05:42
【问题描述】:

我在将 std::pair 、 mpfr_t> 类型的元素插入地图时遇到了麻烦。 std::make_pair 函数调用错误

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

由于我只是将指向 mpfr_t 对象的指针传递给 rec_func 函数,我认为我可以使用 * 运算符取消引用它并将生成的 mpfr_t 作为值保存在映射中。

代码的背景信息和结构:rec_func是一个递归函数。它应该计算某些实例。因为实例数量非常大(10^50 或更多),所以我使用数据类型 mpfr_t。为了避免多次使用相同的参数调用递归函数,我想使用动态编程(又名记忆化)。为此,我使用了一个带有向量的映射,其中三个整数作为键,mpfr_t 作为值。

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

需要先安装 gmp 和 mfpr 库。 sudo apt-get install libgmp3-dev sudo apt-get install 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

}

【问题讨论】:

  • 如果您仍然使用 C++,也许使用 mpfr_class 而不是 mpfr_t?获得 RAII 的好处,这样您就不会陷入手动管理内存、显式处理指针等问题。mpfr_t 有点神奇,可以处理 C 的限制,但同样的魔法位(typedef-ing a size结构为mpft_t) 的数组与C++ 的模板方案冲突,mpfr_class 不会有这样的问题。
  • 谢谢,这解决了我的问题。

标签: c++ pointers memoization gmp mpfr


【解决方案1】:

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

typedef __mpfr_struct mpfr_t[1];

这意味着您不能简单地使用= 复制它(就像在std::make_pair 中所做的那样)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-28
    • 2023-03-13
    • 2017-11-06
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多