首页 > 解决方案 > 在 C++ 中通过引用传递 map 并改变它的值

问题描述

我在 canSum 函数中通过引用传递地图,我正在改变它的值并添加对,但最后当我迭代地图时,我发现地图的值尚未更新。

canSum 函数是一个递归函数,它接受一个数字 (targetSum) 和一个数组,并查找是否可以通过数组中的任何数字组合形成 targetSum(数字可以重复)。

#include<iostream>
#include<vector>
#include<map>

using namespace std;

bool canSum(int targetSum,vector<int> a,map<int, bool> &m){
  if(!(m.find(targetSum) == m.end()))
    return m[targetSum];
  if (targetSum == 0)
    return true;
  if(targetSum<0)
    return false;

  for (int num : a)
  {
    
    if (canSum(targetSum - num, a,m)==true)
    {
      
      // m[targetSum] = true;
      m.insert(pair<int, bool>(targetSum, true));
      return m[targetSum];
    }
  }
  m[targetSum] = false;
  return m[targetSum];
}

int main(){
  int targetSum, t;
  vector<int> a;
  map<int, bool> m;
  m[0] = true;
  cout << "enter target" << endl;

  cin >> targetSum;
  cout << "enter array, press esc to stop entering"<<endl;
  while(cin>>t){
    a.push_back(t);
  }

  for (int j = 0; j < a.size(); j++)
  {
    cout << a[j]<<" ";
  }

  cout << endl;

  for (auto itr = m.begin(); itr != m.end(); ++itr) {
        cout << '\t' << itr->first
             << '\t' << itr->second << '\n';
    }

  if(canSum(targetSum, a,m)){
    cout << endl << "true" << endl;
  }
  else cout << endl << "false" << endl;
  
  return 0;
}

请帮我。谢谢你。

标签: dictionarystlc++17pass-by-reference

解决方案


打印地图的for循环应该在函数调用之后。

if(canSum(targetSum, a,m)){
    cout << endl << "true" << endl;
}
else cout << endl << "false" << endl;

for (auto itr = m.begin(); itr != m.end(); ++itr) {
    cout << '\t' << itr->first
    << '\t' << itr->second << '\n';
}

代替

for (auto itr = m.begin(); itr != m.end(); ++itr) {
    cout << '\t' << itr->first
    << '\t' << itr->second << '\n';
}

if(canSum(targetSum, a,m)){
    cout << endl << "true" << endl;
}
else cout << endl << "false" << endl;

查看由于功能导致的地图突变


推荐阅读