2017-10-09 10 views
0

J'ai le problème suivant - Je veux compter les occurrences de chaque mot dans un fichier. J'utilise un map<string,Count> donc la clé est l'objet de chaîne représentant le mot, et la valeur étant regardé est l'objet qui tient le compte des chaînes de sorte que:incrémenter la valeur dans la carte en utilisant l'insertion C++

class Count { 
    int i; 
public: 
    Count() : i(0) {} 
    void operator++(int) { i++; } // Post-increment 
    int& val() { return i; } 
}; 

Le problème est que je veux utiliser insert() au lieu du operator[]. Voici le code.

typedef map<string, Count> WordMap; 
typedef WordMap::iterator WMIter; 

int main() { 

    ifstream in("D://C++ projects//ReadF.txt"); 

    WordMap wordmap; 
    string word; 
    WMIter it; 
    while (in >> word){ 
     // wordmap[word]++; // not that way 

     if((it= wordmap.find(word)) != wordmap.end()){ //if the word already exists 
     wordmap.insert(make_pair(word, (*it).second++); // how do I increment the value ? 
     }else{ 
      ... 
     } 

    for (WMIter w = wordmap.begin(); 
     w != wordmap.end(); w++) 
     cout << (*w).first << ": " 
     << (*w).second.val() << endl; 
} 
+0

Quel est le problème avec l'aide d'un 'std :: map 'et' wordmap [mot] ++; '? – NathanOliver

+0

@NathanOliver Je fais quelques exercices et je devais le faire avec 'insert()'. Quoi qu'il en soit, la réponse ci-dessous a été claire pour moi. – yooo123

+0

Si la valeur existe déjà, 'insert' n'insèrera rien. –

Répondre

2

Le problème est que je veux utiliser insert() au lieu du operator[]

... pourquoi? std::map::insert ne peut pas muter les valeurs existantes. operator[] est le bon travail pour cela.

Si vous voulez vraiment utiliser insert(s'il vous plaît ne pas), vous devez d'abord erase la valeur existante, le cas échéant:

if((it= wordmap.find(word)) != wordmap.end()) 
{ 
    const auto curr = it->second; // current number of occurrences 
    wordmap.erase(word); 
    wordmap.insert(make_pair(word, curr + 1)); 
} 
+0

Pourrait être plus agréable avec C++ 17: 'if (auto it = wordmap.find (mot); it! = wordmap.end()) {...} ' – lisyarus