Comment représenter un ensemble de pointeurs avec une comparaison personnalisée mais en conservant la comparaison de duplication de pointeur brut d’origine

Fondamentalement, je veux enregistrer un ensemble de pointeurs, qui devraient être sortingés par ma fonction de comparaison personnalisée, mais l’unicité devrait toujours être déterminée par le pointeur lui-même.

Toutefois:

#include  #include  #include  #include  #include  using namespace std; // count, word typedef pair WordFreq; struct WordFreqPointerCmp { bool operator()(const WordFreq* lhs, const WordFreq* rhs) const { return lhs->first > rhs->first; } }; int main() { set s; s.insert(new WordFreq(1, "word1")); // Inserted s.insert(new WordFreq(1, "word2")); // This is not inserted s.insert(new WordFreq(3, "word3")); // Inserted cout << s.size() << endl; for (set::iterator it = s.begin(); it != s.end(); ++it) { cout <second << ": " <first << endl; } return 0; } /* Output: 2 word3: 3 word1: 1 */ 

Comme vous pouvez le constater, la commande est correcte mais les tests de duplication sont erronés. Ce que j’essaie de faire, c’est:

J’ai aussi essayé ce qui suit, mais le même résultat:

 template struct greater { bool operator()(WordFreq* const& lhs, WordFreq* const& rhs) const { return lhs->first > rhs->first; } }; set<WordFreq*, greater > s; 

alors que ce message est ancien, je viens de faire face au même problème, il peut donc aider quelqu’un ..

Dans votre code, vous ne gérez qu’une seule valeur, mais que se passe-t-il si les valeurs sont identiques? Ensuite, set le traite comme le même élément. La solution appropriée consisterait à étendre votre fonction de comparaison pour donner à l’ensemble des informations supplémentaires sur la manière de tester les doublons. Cela peut être quelque chose d’arbitraire comme comparer des chaînes, par exemple dans votre cas:

 struct WordFreqPointerCmp { bool operator()(const WordFreq* lhs, const WordFreq* rhs) const { if (lhs->first == rhs->first) return lhs->second > rhs->second; else return lhs->first > rhs->first; } }; 

Je ne sais pas quel est le problème. Puisque vous voulez que le premier composant de votre paire soit la clé qui détermine l’unicité, l’insertion de deux “WordFreq” avec la clé = 1 devrait entraîner la seconde expulsion du premier. Les résultats correspondent aux attentes ici.

Mise à jour : Je suppose que j’ai mal compris quelque chose. Puisque vous voulez des clés en double, vous recherchez probablement une carte multiple .

Mise à jour 2 : pour que cela fonctionne, vous devez append une étape avant d’append un nouvel object: parcourez toutes les valeurs de la même clé et supprimez celles qui pointent vers l’object ajouté. De plus, j’ai oublié de mentionner le multiset, qui est probablement ce que vous préférez.

J’admets que c’est ici que HashSet de Java avec ses tests séparés d’ordre et d’égalité est utile. Peut-être pouvez-vous en trouver une version C ++.