函数中的默认参数对 c++ 中的引用 unordered_map

Default parameter in function to a reference in c++ unordered_map

我是一名 JS 开发人员,为了实现这个函数头,我这样做了:

function gridTraveler(m,n,memo={})

这里,我知道对象在JS中是通过引用传递的

所以在 C++ 中,我决定这样做:

int gridTraveler(int m,int n,std::unordered_map<int,int>& memo = {})

但我得到一个错误:“对非 const 的初始引用必须是左值”。

我应该如何将默认参数传递给函数以及通过引用传递 hasmap?

注意:我将通过在函数主体中添加键和值来编辑备忘录对象

您不能对临时值进行引用。
这里:std::unordered_map<int, int>& memo = {} //The "{}" is a tempory value
使用 const std::unordered_map<int, int>& memo = {} 或使用不带“&”的值。

您的意思可能可以通过处理无序映射生命周期的双参数重载来实现。

int gridTraveler(int m,int n,std::unordered_map<int,int>& memo) {
    //your implementation here
}

int gridTraveler(int m, int n) {
    std::unordered_map<int,int> memo = {};
    return gridTraveler(m, n, memo);
}

考虑明确告诉它您真正想要什么或创建多个函数 - 一个接受地图或不接受地图的函数。

可能性一:有时候你想提供一张地图,但是这张地图没有任何操作价值;它只是一些可选的输出。 C++ 尽最大努力防止 NULL 值作为引用,因此使用指针。如果您真的不需要,向一次性地图添加值也很愚蠢。

int gridTraveler(int m,int n,std::unordered_map<int,int>* const memo = nullptr)
{
//code stuff for operation
  if(memo) //optional output related operations occur if it was provided
  {
    //populate memo if it is available
  }
}

可能性 2:您希望有时输出一张在操作中内部使用的地图。未提供时,您想使用一个空映射作为值,然后将其丢弃。您的操作需要地图,但它是副产品,您只是有时关心它的值。

int gridTraveler(int m,int n,std::unordered_map<int,int>& memo)
{
//do your thing...
}
int gridTraveler(int m,int n)
{
std::unordered_map<int,int> memo;
const int returnval = gridTraveler(m,n,memo);
//last chance to do something with memo here before it gets thrown out
return returnval;
}

还有很多其他可能性 - 我可以想到地图最好实现的场景 class 成员,其中 gridTraveler 是 class 的函数以及地图的位置全局范围,每个进程仅初始化一次为空映射。