2010-07-15 9 views
0

Je cherchais une solution efficace pour supprimer les doublons d'une liste C++.Supprimer les doublons d'une liste C++

La liste se compose de pointeurs vers un objet de classe qui a un ID d'attribut. Je veux supprimer les doublons en fonction de cet identifiant. Pour mon but, la méthode unique de la liste STL fonctionnera dans laquelle nous pouvons passer un BinaryPredicate. c'est-à-dire

void unique (BinPred pr);

J'ai cherché sur Internet comment utiliser cette méthode, n a obtenu un exemple dans lequel nous pouvons déclarer une fonction retournant une valeur booléenne et utiliser le "nom" de cette fonction comme prédicat binaire.

Mais ça ne marche pas. Qu'est-ce que ce prédicat binaire et comment l'utiliser? ... Toute aide sera appréciée. Voici l'extrait de code:

class SP_MDI_View { 
.. 
.. 
bool removeDupli(SP_DS_Node*, SP_DS_Node*); 
bool DoReductionGSPN(SP_DS_Node*, SP_ListNode*, SP_DS_Node*); 
.. 
.. 
} 
SP_MDI_View::DoReduction(...) { 
SP_ListNode setZ; // typedef list<SP_DS_Node*> SP_ListNode, where SP_DS_Node is some other class 
setZ.clear(); 
setZ.merge(tempsubset); 
setZ.merge(setX); 
setZ.push_back(*cs_iter); 
setZ.unique(removeDupli); //Error here 
} 
bool SP_MDI_View::removeDupli(SP_DS_Node* first, SP_DS_Node* second) { 
return ((first->GetId())==(second->GetId())); 
} 
+0

Ceci est le lien qui a l'exemple dont je parlais: http://www.cplusplus.com/reference/stl/list/unique/ est-ce valide? mylist.unique (same_integral_part); mon compilateur ne le prend pas comme une instruction valide. –

+1

Que voulez-vous dire "ne fonctionne pas"? Compiler l'erreur? Segfault? – SoapBox

+0

post ** votre ** code, est-ce une fonction membre? Quelle est la portée? –

Répondre

0

Vous pouvez écrire une fonction comme:

bool foo (int first, int second) 
{ return (first)==(second)); } 

, vous devrez peut-être également de déclarer la fonction statique si vous utilisez en classe.

+0

oui j'ai essayé de le faire. alors j'ai fait mylist.unique (foo); mais le compilateur ne dit aucune fonction correspondante unique. –

+0

J'ai posté le code source ci-dessus. Une chose statique dit "ne peut pas déclarer que la fonction membre a une liaison statique" –

+0

@Gaurav: 'static' ne devrait apparaître que dans la déclaration de la classe, et non lors de la définition de la fonction membre hors-classe. –

0

Vous devez utiliser unique sur une liste ordonnée . Donc la première chose que vous devez faire est de trier la liste.

+0

tout en triant aussi, j'ai une fonction de tri surchargé utilise le prédicat binaire. la façon dont je fais le tri est: définir une fonction booléenne, l'utiliser comme prédicat binaire. Mais ça ne marche pas. est-ce valable? mylist.sort (same_integral_part); je veux dire que same_integral_part est une fonction et nous la passons sous same_integral_part? –

Questions connexes