Javascript 函数中的默认参数指向c++;无序地图

Javascript 函数中的默认参数指向c++;无序地图,javascript,c++,unordered-map,memoization,Javascript,C++,Unordered Map,Memoization,我是一名JS开发人员,要实现此函数头,我需要: function gridTraveler(m,n,memo={}) 在这里,我知道对象将在JS中通过引用传递 在C++中,我决定做: int gridTraveler(int m,int n,std::unordered_map<int,int>& memo = {}) intgridtraveler(intm,intn,std::无序地图和备忘录={}) 但我得到一个错误:“对非常量的初始引用必须是左值” 如何将默认参

我是一名JS开发人员,要实现此函数头,我需要:

function gridTraveler(m,n,memo={})
在这里,我知道对象将在JS中通过引用传递

在C++中,我决定做:

int gridTraveler(int m,int n,std::unordered_map<int,int>& memo = {})
intgridtraveler(intm,intn,std::无序地图和备忘录={})
但我得到一个错误:“对非常量的初始引用必须是左值”

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


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

您不能对临时值进行引用
这里:
std::无序映射&memo={}//“{}”是一个临时值


使用
const std::unordered_map&memo={}
或使用不带“&”的值。

您不能对临时值进行引用
这里:
std::无序映射&memo={}//“{}”是一个临时值


使用
const std::unordered_map&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);
}
intgridtraveler(intm,intn,std::无序地图和备忘录){
//您在这里的实现
}
int gridTraveler(int m,int n){
std::无序地图备忘录={};
返回(m、n、备忘录);
}

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

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);
}
intgridtraveler(intm,intn,std::无序地图和备忘录){
//您在这里的实现
}
int gridTraveler(int m,int n){
std::无序地图备忘录={};
返回(m、n、备忘录);
}

考虑明确地告诉它你真正想要什么,或者创建多个函数——一个需要映射,一个不需要映射

可能性1:您有时想提供一张地图,但该地图没有任何操作价值;这只是一些可选的输出。C++最好将空值作为引用,所以使用指针。如果你真的不需要,给一次性地图添加值也是愚蠢的

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
  }
}
intgridtraveler(intm,intn,std::无序映射*const memo=nullptr)
{
//操作代码
if(memo)//如果提供了,则会发生与输出相关的可选操作
{
//填充备忘录(如果可用)
}
}
可能性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;
}
intgridtraveler(intm,intn,std::无序地图和备忘录)
{
//做你的事。。。
}
int gridTraveler(int m,int n)
{
std::无序地图备忘录;
const int returnval=gridTraveler(m,n,memo);
//在备忘录被扔掉之前,最后一次用它做点什么的机会
返回值;
}

还有很多其他的可能性-我可以想象这样的场景:map是类的最佳实现成员,gridTraveler是类的一个函数,map在全局范围内,每个进程只初始化一次空映射。

考虑显式地告诉它您真正想要什么或创建多个函数-一个接受映射,一个不接受映射

可能性1:您有时想提供一张地图,但该地图没有任何操作价值;这只是一些可选的输出。C++最好将空值作为引用,所以使用指针。如果你真的不需要,给一次性地图添加值也是愚蠢的

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
  }
}
intgridtraveler(intm,intn,std::无序映射*const memo=nullptr)
{
//操作代码
if(memo)//如果提供了,则会发生与输出相关的可选操作
{
//填充备忘录(如果可用)
}
}
可能性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;
}
intgridtraveler(intm,intn,std::无序地图和备忘录)
{
//做你的事。。。
}
int gridTraveler(int m,int n)
{
std::无序地图备忘录;
const int returnval=gridTraveler(m,n,memo);
//在备忘录被扔掉之前,最后一次用它做点什么的机会
返回值;
}

还有很多其他的可能性-我可以想象这样的场景:map是类的一个函数,gridTraveler是类的一个最佳实现成员,map在全局范围内,每个进程只初始化一次以清空map。

hashmap的生命周期是什么,谁负责删除它?“当它不再需要时,它应该被自动清理”。C++中没有选项,因为没有垃圾收集。哈希图的生命周期是什么,谁负责移除它?“当它不再需要时,它应该被自动清理”。在C++中,这不是一个选项,因为没有垃圾收集。const不会使它不变吗?我想插入关键字值对。我还需要把引用传递给其他递归调用子,对。你可以使用一个智能指针,一个全局对象(和对它的引用),或者像下面这样做。常量不会使它不可变吗?我想插入键值对。我还需要将引用传递给进一步的递归调用,没错。您可以使用智能指针、全局对象(并引用此对象)或按如下方式操作。谢谢。这是一个好的实践吗?VerilogCoder取决于你在做什么。一次就可以了。如果调用生成的内容可以重新用于进一步的计算,那么最好让调用方管理映射和/或使其全局化。谢谢。这是一个好的实践吗?VerilogCoder取决于你在做什么。一次就可以了。