2016-07-13 26 views
0

有人可以解釋爲什麼每當我嘗試增加對時什麼都沒有發生?我試着調試它,儘管它發生在遞增行注意到。修改地圖對的值

編輯:這裏是全功能

void VoteCollector::resultsBasedOnAge(std::vector<Voter>& voters) 
{ 
    std::map<int,std::pair<int,int>> ageVoters; 
    std::map<int,std::pair<int,int>>::iterator hasAge = ageVoters.begin(); 


    for(unsigned i = 0; i < voters.size(); i++) 
    { 
     if(ageVoters.find(voters.at(i).getAge()) != ageVoters.end()) 
     { 
      if(voters.at(i).getVote() == "leave") 
      { 
       hasAge->second.first++; 
      } 
      else if(voters.at(i).getVote() == "stay") 
      { 
       hasAge->second.second++; 
      } 
      hasAge++; 
     } 
     else 
     { 
      if(voters.at(i).getVote() == "leave") 
      { 
       ageVoters.insert(std::make_pair(voters.at(i).getAge(),std::make_pair(1,0))); 
      } 
      else if(voters.at(i).getVote() == "stay") 
      { 
       ageVoters.insert(std::make_pair(voters.at(i).getAge(),std::make_pair(0,1))); 
      } 
      hasAge++; 
     } 
    } 

    for(std::map<int,std::pair<int,int>>::iterator it = ageVoters.begin(); it != ageVoters.end(); it++) 
    { 
     std::cout << it->first << " years -- " << it->second.first << " leave.\t" << it->second.second << " stay\n"; 
    } 
} 
+1

請編輯您的問題包含一個[MCVE] – NathanOliver

+0

既然你不顯示什麼'hasAge'是我懷疑任何人可以幫助很大。我猜'hasAge'實際上是你想要修改的副本。 – nwp

+0

@NathanOliver你有MCVE的自動標記,如果是的話我怎樣才能導入它? – Slava

回答

1

從我所看到的,您的代碼不工作,因爲你的hasAge指向,我不知道在什麼地方你可能不是故意的。你想分配給它std::map::find的結果。

假設你正在使用C++ 11的代碼也可以簡化爲:

void VoteCollector::resultsBasedOnAge(const std::vector<Voter>& voters) 
{ 
    std::map<int, std::pair<int, int>> ageVoters; 

    for (const auto& v: voters) 
    { 
     int age = v.getAge(); 
     const auto& vote = v.getVote(); 

     auto it = ageVoters.find(age); 
     if (it != ageVoters.cend()) 
     { 
      if (vote == "leave") 
      { 
       ++it->second.first; 
      } 
      else if (vote == "stay") 
      { 
       ++it->second.second; 
      } 
     } 
     else 
     { 
      if (vote == "leave") 
      { 
       ageVoters.insert(std::make_pair(age, std::make_pair(1, 0))); 
      } 
      else if (vote == "stay") 
      { 
       ageVoters.insert(std::make_pair(age, std::make_pair(0, 1))); 
      } 
     } 
    } 

    for (const auto& v: voters) 
    { 
     std::cout << v.first << " years -- " 
        << v.second.first << " leave.\t" 
        << v.second.second << " stay\n"; 
    } 
} 
+0

是的,它修復了它。似乎咖啡不夠:/非常感謝你! –

+0

你不需要檢查元素是否已經存在,但你應該使用'std :: map :: operator []'來代替:'auto&pair = ageVoters [age]; if(vote ==「leave」)++ pair.first; ...' – Slava

+0

@Slava小心,它與'insert'具有完全不同的語義。當沒有現有元素時使用括號運算符將首先默認構造一個元素,然後將操作數賦給該默認構造元素**。這幾乎肯定會對用戶定義的類型有一些性能影響。 –