std :: unique et supprimer les doublons d’un conteneur d’objects

J’aimerais savoir s’il existe un moyen efficace de supprimer des objects d’un conteneur en fonction des valeurs des champs membres des objects. Par exemple, je peux faire ce qui suit avec stl :: unique avec une liste de chaînes:

#include #include #include #include using namespace std; bool ssortingngCompare(const ssortingng & l, const ssortingng & r) { return (l==r); } int main() { list mySsortingngs; mySsortingngs.push_back("1001"); mySsortingngs.push_back("1001"); mySsortingngs.push_back("81"); mySsortingngs.push_back("1001"); mySsortingngs.push_back("81"); mySsortingngs.sort(); mySsortingngs.erase(unique(mySsortingngs.begin(), mySsortingngs.end(), ssortingngCompare), mySsortingngs.end()); list::iterator it; for(it = mySsortingngs.begin(); it != mySsortingngs.end(); ++it) { cout << *it << endl; } return 0; } 

imprime 1001, 81 …

Est-il possible de faire quelque chose de similaire avec le code suivant ou dois-je effectuer les comparaisons “manuellement” à l’aide d’opérateurs et en effectuant une itération dans les conteneurs? Je ne pouvais pas penser à une solution plus élégante et voudrais savoir si cela est possible sans écrire beaucoup de code. Toute aide sera très appréciée!

 class Packet { public: Packet(ssortingng fTime, ssortingng rID) : filingTime(fTime), recordID(rID) ssortingng getFilingTime() {return filingTime;} ssortingng getRecordId() {return recordID;} private: ssortingng filingTime; ssortingng recordID; }; int main() { vector pkts; pkts.push_back(new Packet("10:20", "1004")); pkts.push_back(new Packet("10:20", "1004")); // not unique (duplicate of the line above) pkts.push_back(new Packet("10:20", "251")); pkts.push_back(new Packet("10:20", "1006")); // remove packet from vector if time and ID are the same return 0; } 

Merci

Deux options pour pouvoir utiliser std::unique :

  1. Définissez une méthode operator== pour Packet et changez le vector en vector .

     bool Packet::operator==(const Packet& rhs) const { if (getFilingTime() != rhs.getFilingTime()) return false; if (getSpid() != rhs.getSpid()) return false; return true; } //etc. int main() { vector pkts; pkts.push_back(Packet("10:20", "1004")); pkts.push_back(Packet("10:20", "1004")); // not unique (duplicate of the line above) pkts.push_back(Packet("10:20", "251")); pkts.push_back(Packet("10:20", "1006")); // remove packet from vector if time and ID are the same pkts.erase(unique(pkts.begin(), pkts.end()), pkts.end()); return 0; } 
  2. Conservez le vecteur en tant que vector et définissez une méthode pour comparer les éléments.

     bool comparePacketPtrs(Packet* lhs, Packet* rhs) { if (lhs->getFilingTime() != rhs->getFilingTime()) return false; if (lhs->getSpid() != rhs->getSpid()) return false; return true; } //etc. int main() { vector pkts; pkts.push_back(new Packet("10:20", "1004")); pkts.push_back(new Packet("10:20", "1004")); // not unique (duplicate of the line above) pkts.push_back(new Packet("10:20", "251")); pkts.push_back(new Packet("10:20", "1006")); // remove packet from vector if time and ID are the same pkts.erase(unique(pkts.begin(), pkts.end(), comparePacketPtrs), pkts.end()); return 0; } 

Au lieu d’ unique , vous pouvez simplement insérer les éléments dans un set (ou unordered_set en C ++ 11).

Quelle que soit la méthode choisie, vous devrez définir des opérateurs de comparaison pour Packet . Pour unique , vous aurez besoin de l’ operator== ; pour le set vous aurez besoin de l’ operator< . Pour être complet, vous devez définir les deux et leurs équivalents:

 class Packet { … bool operator==(const Packet& p) const { return fillingTime == p.fillingTime && recordID == p.recordID; } bool operator<(const Packet& p) const { return fillingTime < p.fillingTime || (fillingTime == p.fillingTime && recordID < p.recordID); } bool operator!=(const Packet& p) const { return !(*this == p); } bool operator> (const Packet& p) const { return p < *this; } bool operator>=(const Packet& p) const { return !(*this < p); } bool operator<=(const Packet& p) const { return !(p < *this); } … }; 

Si vous utilisez unordered_set de C ++ 11, vous devrez aller plus loin et définir une fonction de hachage.

EDIT: Je viens de remarquer que vous stockez des pointeurs sur Packet . Pourquoi? Juste stocker le Packet directement.