【问题标题】:Default parameter in function to a reference in c++ unordered_map函数中的默认参数对 c++ unordered_map 中的引用
【发布时间】:2021-08-17 12:55:53
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • 该哈希图的生命周期是多少,谁负责删除它? “它应该在不再需要时自动清理。”在 C++ 中不是一个选项,因为没有垃圾收集。

标签: javascript c++ unordered-map memoization


【解决方案1】:

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

可能性 1:您有时想提供一张地图,但该地图没有任何操作价值;它只是一些可选的输出。 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;
}

还有很多其他的可能性——我可以想到地图最好实现类成员的场景,gridTraveler 是该类的一个函数,并且地图将在全局范围内,只初始化一次以清空地图每个进程。

【讨论】:

    【解决方案2】:

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

    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);
    }
    

    【讨论】:

    • @VerilogCoder 取决于你在做什么。一次运行就可以了。如果调用产生的东西可以被重用于进一步的计算,你最好让调用者管理地图和/或让它完全全局化。
    【解决方案3】:

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

    【讨论】:

    • const 不会使其不可变吗?我想插入键值对。另外我需要将引用传递给进一步的递归调用
    • 是的,没错。您可以使用智能指针、全局对象(并引用 this)或如下所示。
    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2015-10-27
    • 2011-01-06
    • 2012-02-26
    相关资源
    最近更新 更多