【问题标题】:Is there any way to assign default value to a map passed as a parameter by reference to a function in C++?有没有办法通过引用 C++ 中的函数为作为参数传递的映射分配默认值?
【发布时间】:2022-01-17 07:55:21
【问题描述】:

我正在尝试在递归函数中使用 map(作为 DP 的实现)。在这里,我写了一个简单的斐波那契函数(我知道我可以在这里使用一个普通数组,但我想知道我可以在其他函数中使用它,这些函数将接受更复杂的输入,如对、字符串、对象等)。

#include <bits/stdc++.h>
using namespace std;
#define int long long

int fib(int n, map<int, int> &memo); // What I did

/* What I want:
Instead of pulling an external map as an argument,
the function will automatically create an empty map as a default parameter at the first call
and pass it by reference in the recursive calls. */

/* I tried some stuff
int fib(int n, map<int,int> memo={}); // Slow
int fib(int n, map<int, int> &memo, bool reset);  // Works, but I want to know if there are any better idea which doesn't take 3 inputs
int fib(int n, map<int, int> &memo={}); // Doesn't compile (my target is something close to this)
*/

signed main()
{
    map<int,int> mp; // Needs to be empty before being passed to fib()
    int n;
    cin >> n;
    cout << n << ' ' << fib(n, mp); // I want to use just fib(n)

    return 0;
}

int fib(int n, map<int, int> &memo) // The external memo needs to be empty
{
    if(n==!!n) return n;
    if(memo.find(n)!=memo.end()) return memo[n];

    if(n<0)
    {
        if(n%2) return fib(-n, memo);
        return -fib(-n, memo);
    }

    memo[n]=fib(n-1, memo)+fib(n-2, memo);
    return memo[n];
}

想知道有没有办法在C++中实现空map参数。

【问题讨论】:

  • #define int long long -- 停在那里。这真的很糟糕,你不应该重新定义这样的事情。一般避免使用#define
  • n == !!n 不只是写n == 1 || n == 0 的一种混淆方式吗?
  • 好的,我去看看#define的效果。
  • 是的,(n==!!n) 与 (n==1 || n==0) 相同。只是我已经写了很多遍了,所以现在只是把它写成了一种习惯。

标签: c++ recursion dynamic-programming stdmap memoization


【解决方案1】:

你可以简单地重载函数:

int fib(int n)
{
  std::map<int, int> map;

  fib(n, map);
}

int fib(int n, map<int, int> &memo) { ... }

这就是你想要达到的目标吗?


旁注:你应该删除#define int long long,它不是合法的 C++ 并且完全令人困惑。

【讨论】:

猜你喜欢
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
相关资源
最近更新 更多