std::unique et la suppression des doublons à partir d'un conteneur d'objets

Je voudrais savoir si il existe un moyen efficace pour supprimer des objets d'un conteneur basé sur des valeurs de champs des membres de la objets. Par exemple, je peux effectuer les opérations suivantes à l'aide de la stl::unique avec une liste de chaînes de caractères:

#include<iostream>
#include<list>
#include<string>
#include<algorithm>
using namespace std;

bool stringCompare(const string & l, const string & r)                                                                                   
{                                                                                                                                    
   return (l==r);                                                                                                                         
}

int main()                                                                                                                               
{                                                                                                                                        

  list<string> myStrings;                                                                                                                
  myStrings.push_back("1001");                                                                                                           
  myStrings.push_back("1001");                                                                                                           
  myStrings.push_back("81");                                                                                                             
  myStrings.push_back("1001");                                                                                                           
  myStrings.push_back("81");                                                                                                             

  myStrings.sort();                                                                                                                      
  myStrings.erase(unique(myStrings.begin(), myStrings.end(), stringCompare), myStrings.end());                                           

  list<string>::iterator it;                                                                                                             
  for(it = myStrings.begin(); it != myStrings.end(); ++it)                                                                               
  {                                                                                                                                      
    cout << *it << endl;                                                                                                                 
  }                                                                                                                                      

  return     0;                                                                                                                              
}

imprime 1001, 81...

Est-il un moyen que je peux faire quelque chose de similaire avec le code suivant, ou puis-je besoin pour effectuer les comparaisons "manuellement" à l'aide des opérateurs et d'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(string fTime, string rID) : filingTime(fTime), recordID(rID)

  string getFilingTime() {return filingTime;}
  string getRecordId() {return recordID;}

private:
  string filingTime;
  string recordID;

};

int main()
{
vector<Packet*> 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;
}

Grâce

Pourquoi avez-vous un vecteur de pointeurs? Une fois que vous avez un vecteur de Paquets, tout ce que vous devez faire est d'ajouter un Packet::operator==.
C'est ce que j'ai passées d'une autre méthode (pas mon code). Je pouvais changer et les choses serait plus facile je pense... Ah, je ne l'aurais cru.

OriginalL'auteur tapatron | 2012-10-11