2016-07-13 4 views
0

誰かが何故ペアを増やそうとしても何も起こらないと説明できますか?私はそれをデバッグしようとしていますが、それは増分ラインに行くが起こっていることに気づく。マップペアの値を変更する

EDIT:ここでは全体の機能は、私が見たものから

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

あなたは私が誰を疑う何 'hasAge'が表示されていないので、[MCVE] – NathanOliver

+0

を含むようにあなたの質問を編集してください多くを助けることができます。私は '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'とは全く異なるセマンティクスを持っています。既存の要素が存在しないときに大括弧演算子を使用すると、最初にデフォルトで要素が構築され、その既定の要素**にそのオペランドが割り当てられます。これは、ほとんどの場合、ユーザー定義型にいくらかのパフォーマンスの影響を与えます。 –