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.

Voici le code initial:

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;
}
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
#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;
}
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
bool cmp(const pair<string, int>& a, const pair<string, int>& b) {
	return a->second < b->second;
}
... sans davantage de succès.