2016-07-13 18 views
0

Kann jemand erklären, warum, wenn ich versuche, das Paar zu erhöhen, passiert nichts? Ich habe versucht, es zu debuggen und obwohl es zu der steigenden Zeile kommt, geschieht das.Ändern des Werts des Kartenpaars

EDIT: Hier ist die ganze Funktion

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

Bearbeiten Sie Ihre Frage ein enthalten [MCVE] – NathanOliver

+0

Da Sie zeigen nicht, was 'hasAge' ist ich jemand zweifeln kann viel helfen. Ich denke, 'hasAge' ist eigentlich eine Kopie von dem, was Sie ändern möchten. – nwp

+0

@NathanOliver Haben Sie Auto-Tag für MCVE, wenn ja, wie kann ich es importieren? – Slava

Antwort

1

Von dem, was ich sehe, Ihr Code funktioniert nicht, weil Ihre hasAge zu zeigt, ich weiß nicht, irgendwo Sie wahrscheinlich bedeuten nicht zu. Sie möchten ihm das Ergebnis zuweisen.

Sie Angenommen werden unter Verwendung von C++ 11, kann der Code auch vereinfacht werden:

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

Ja, das hat es behoben. Scheint wie der Kaffee war nicht genug:/Vielen Dank !! –

+0

Sie brauchen keine Bedingung, um zu überprüfen, ob das Element bereits vorhanden ist, aber Sie sollten stattdessen 'std :: map :: operator []' verwenden: 'auto & pair = ageVoters [age]; if (vote == "leave") ++ pair.first; ... ' – Slava

+0

@Slava Vorsicht, das hat eine komplett andere Semantik als' Einfügen'. Wenn Sie den Operator eckigen Klammern verwenden, wenn kein vorhandenes Element vorhanden ist, wird ** zuerst ein Element standardmäßig konstruiert, und dann wird der Operand diesem standardmäßig konstruierten Element zugewiesen **. Das wird fast sicher einige Auswirkungen auf die Leistung für benutzerdefinierte Typen haben. –

Verwandte Themen