【问题标题】:Map doesn't store values in recursion地图不以递归方式存储值
【发布时间】:2021-12-10 13:12:05
【问题描述】:

我不知道为什么,但是当递归尝试添加值然后返回它时,函数返回后的映射删除了所有元素,我不明白这是什么问题。

static int SumNum(string target, string m[], map<string, int> memo = {}){

        if (memo.find(target) != memo.end()) {
            cout << memo.find(target)->second<<"\n";
            return memo.find(target)->second;
        }
        if (target == "") return 1;

        int totalCount = 0;
        
    for(auto i = 0;i < 10; i++)
    {   
        if (target.find(m[i]) == 0){
            
            int numOfWays = SumNum(target.substr(m[i].length()),m,memo);
            totalCount += numOfWays;
            
        }
    }
    memo.emplace(target, totalCount);
    return totalCount;
}
int main(){
    string ar[10] = {"e","ee","eee","eeee","eeeee","eeeeee","f","fdc","d","c"};
    string target = "eeeeeeeeefdc";
    auto answer = SumNum(target,ar);
    cout << answer;
}

【问题讨论】:

标签: c++ dictionary recursion


【解决方案1】:

我认为@Max 的意思是:

static int SumNum(std::string target, std::string m[], std::map<std::string, int>& memo /* pass by reference */){

        if (memo.find(target) != memo.end()) {
            std::cout << memo.find(target)->second<<"\n";
            return memo.find(target)->second;
        }
        if (target == "") return 1;

        int totalCount = 0;
        
    for(auto i = 0;i < 10; i++)
    {   
        if (target.find(m[i]) == 0){
            
            int numOfWays = SumNum(target.substr(m[i].length()),m,memo);
            totalCount += numOfWays;
            
        }
    }
    memo.emplace(target, totalCount);
    return totalCount;
}
int main(){
    std::map <std::string, int> map;
    std::string ar[10] = {"e","ee","eee","eeee","eeeee","eeeeee","f","fdc","d","c"};
    std::string target = "eeeeeeeeefdc";
    auto answer = SumNum(target, ar, map);
    std::cout << answer;
}

【讨论】:

  • 不行,需要初始化map,编译器说是这样
  • @skamer 我已经编辑了我的代码。
【解决方案2】:

感谢@Max,我确实像你说的那样

static int SumNum(string target, string m[], map<string, int> *memo = new map<string, int>()) {
        
        if (memo->find(target) != memo->end()) {
            cout << memo->find(target)->second<<"\n";
            return memo->find(target)->second;
        }
        if (target == "") return 1;

        int totalCount = 0;
        
    for(auto i = 0;i < 10; i++)
    {   
        if (target.find(m[i]) == 0){
            
            int numOfWays = SumNum(target.substr(m[i].length()),m,memo);
            totalCount += numOfWays;
            
        }
    }
    memo->emplace(target, totalCount);
    return totalCount;
}
int main(){
    string ar[10] = {"e","ee","eee","eeee","eeeee","eeeeee","f","fdc","d","c"};
    string target = "eeeeeeeeeeeeefdc";
    auto answer = SumNum(target,ar);
    cout << answer;
}

【讨论】:

  • 您的代码泄漏了内存(并且没有按照 Max 的建议执行)。当您使用默认参数时,将使用new 创建映射,但绝不会使用deleted。建议是使用引用,而不是使用指针。 (使用指针是“通过引用传递”的 C 方式,但您使用的是 C++。C++ 使用引用。)
  • @skamer 请使用valgrind 运行代码并修复它将指出的错误。 (它会通过-g 编译的二进制文件为您提供确切的行号和有用的内存管理提示。)您在答案中的内容看起来像是一场内存管理灾难。
  • 我看到你来自波兰,我们可以联系吗?
  • 这是一场灾难,但我才刚刚开始学习
  • ==8896== 泄漏摘要:==8896== 肯定丢失:0 个块中的 0 个字节 ==8896== 间接丢失:0 个块中的 0 个字节 ==8896== 可能丢失: 0 个块中的 0 个字节 ==8896== 仍然可以访问:55 个块中的 1,766 个字节 ==8896== 抑制:0 个块中的 0 个字节 ==8896== ==8896== 错误摘要:来自 0 个上下文的 0 个错误(抑制: 0 从 0)
猜你喜欢
  • 2015-12-16
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多