2010-05-08 4 views
2

Disons que j'ai:est le « == » opérateur qui doit être défini pour utiliser std :: trouver

class myClass 
std::list<myClass> myList 

où myClass ne définit pas l'opérateur == et ne se compose des champs publics.

Dans les deux VS2010 et VS2005 ce qui suit ne compile pas:

myClass myClassVal = myList.front(); 
std::find(myList.begin(), myList.end(), myClassVal) 

se plaindre du manque d'opérateur ==.

J'ai naïvement supposé qu'il ferait une comparaison de valeur des membres publics de l'objet myClass, mais je suis presque certain que ce n'est pas correct.

Je suppose que si je définis un opérateur == ou si j'utilise un foncteur à la place, cela résoudra le problème. Sinon, si ma liste contenait des pointeurs au lieu de valeurs, la comparaison fonctionnerait.

Est-ce exact ou devrais-je faire autre chose?

+0

Si votre liste contenait des pointeurs, 'std :: find' comparerait bien sûr des pointeurs, pas des valeurs. Par conséquent, vous ne trouverez jamais '& myClassVal'. – MSalters

+0

droit, car il pointe vers la mémoire locale qui ne figure pas dans la liste. THX. –

Répondre

7

Le compilateur ne génère pas automatiquement un operator==() par défaut, donc si vous n'en écrivez pas vous-même, les objets de votre classe ne peuvent pas être comparés pour l'égalité. Si vous voulez une comparaison memberwise sur les membres publics, vous devez l'implémenter comme operator==() (ou "manuellement" utiliser une fonction/foncteur séparé pour faire la comparaison).

5

La recherche requiert que la valeur soit equality comparable et le compilateur ne vous définira pas par défaut operator==.

Vous pouvez également utiliser find_if et fournir un prédicat de foncteur.

3

std::find besoin operator==. Même si les membres sont publics, cela ne signifie pas nécessairement qu'ils sont tous pertinents pour définir ce que l'égalité signifie pour cette classe. Si vous ne voulez pas surcharger l'opérateur pour une raison quelconque (par exemple, il n'y a pas une seule signification intuitive de l'égalité pour cette classe, les instances peuvent être considérées comme égales à certains égards), vous pouvez coder une fonction appropriée objet et utiliser std::find_if. Par exemple:

struct same_surname_as 
{ 
    Person p; 
    same_surname_as(const Person& x): p(x) {} 
    bool operator()(const Person& person) const { return p.surname == person.surname; } 
}; 

list<Person> li; 
find(li.begin(), li.end(), same_surname_as(Person("Pu Songling")); 
Questions connexes