Bonjour à tous. À l'exercice 7-1 du livre Accelerated C++, on demande de faire évoluer un code servant à compter le nombre d'occurrences de mots, pour que le trie se fasse non plus par ordre alphabétique des mots trouvés (acrobate: 2 fois, jongleur: 3 fois, ...) mais par ordre des occurrences (Mots apparaissant n fois: mes_mots1, Mots apparaissant (n-1) fois: mes_mots2...).
Quelques lignes au-dessus de la question, l'expression suivante apparait:
Cela ne peut être un hasard. cmp est le prédicat servant à déterminer l'ordre des éléments. Jusque là, c'est tout ce qui est dit à propos des prédicats des map.
Code : Sélectionner tout - Visualiser dans une fenêtre à part map<K, V> m(cmp);
Voici le code initial:
Voici mon code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #include <iostream> #include <map> #include <string> using std::cin; using std::cout; using std::endl; using std::map; using std::string; int main() { string s; map<string, int> counters; // store each word and an associated counter // read the input, keeping track of each word and how often we see it while (cin >> s) ++counters[s]; // write the words and associated counts #ifdef _MSC_VER for (std::map<string, int>::const_iterator it = counters.begin(); #else for (map<string, int>::const_iterator it = counters.begin(); #endif it != counters.end(); ++it) { cout << it->first << "\t" << it->second << endl; } return 0; }
La compilation échoue (ligne Map counters(cmp)). Au début j'avais écrit cmp() de la façon suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #include <iostream> #include <map> #include <string> using namespace std; typedef map<string, int> Map; typedef Map::const_iterator Map_iter; bool cmp(const Map_iter& a, const Map_iter& b) { return a->second < b->second; } int main() { string s; Map counters(cmp); while (cin >> s) ++counters[s]; for (Map_iter it = counters.begin(); it != counters.end(); ++it) /* code à ajouter pour afficher les occurrences, suivis des mots correspondants */ return 0; }
... sans davantage de succès.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 bool cmp(const pair<string, int>& a, const pair<string, int>& b) { return a->second < b->second; }
Partager