2017-09-18 3 views
2

je la structure suivante:C++: Comment vérifier qu'un objet avec une propriété spécifique existe dans un ensemble

struct dependence { 
    dependence() {} 
    dependence(string CUid, LID sink, LID source, std::string var) 
    : CUid(CUid), sink(sink), source(source), var(var) {} 

    string CUid; 

    LID sink = 0; 
    LID source = 0; 
    std::string var; 
}; 

Maintenant, je veux insérer des objets de cette structure dans un ensemble. J'ai des objets avec le même CUid mais (important!) Les autres propriétés (sink, source, var) peuvent différer. Je veux empêcher d'insérer des objets avec le même CUid dans l'ensemble. Donc, la seule façon que je sais, est de parcourir l'ensemble et vérifier chaque objet de la CUid. Y at-il un meilleur moyen avec moins de code pour vérifier cela?

+1

Utilisez un comparateur personnalisé pour le (http://en.cppreference.com/w/cpp/container/set) [ 'std :: set'] qui vérifie le 'CUid'? –

+1

Définir un comparateur personnalisé (ou peut-être remplacer l'opérateur '<' de votre 'struct') qui utilise seulement le' CUid' dans la comparaison. Exemple [ici] (https://stackoverflow.com/questions/16894700/c-custom-compare-function-for-stdsort). – hnefatl

Répondre

4

Vous pouvez utiliser un comparateur personnalisé qui définit l'ordre dans lequel vos objets seront stockés dans l'ensemble.

struct cmp 
{ 
    bool operator()(const dependence &a,const dependence &b) const 
    { 
     return a.CUid < b.Cuid; 
    } 
}; 

puis

std::set<dependence,cmp> myset; 

Maintenant, si vous essayez d'insérer des objets avec la même CUid, seule la première instance ira dans myset.

EDIT:

Une autre façon serait de surcharger l'opérateur <.

bool operator<(const dependence &a,const dependence &b) 
{ 
    return (a.CUid<b.CUid); 

} 

puis

std::set<dependence> myset; 
+0

En outre, vous pouvez savoir s'il existait auparavant dans l'ensemble en chcking 'myset.insert (cuid) .second'. C'est un 'bool' mis à' true' s'il est inséré, et 'false' si précédemment existant. – Caduchon

+0

@YSC Je viens de l'ajouter. –

+0

@Caduchon Comment utiliser 'myset.insert (cuid) .second'? Mon ensemble est un ensemble d'objets 'dependency'. Donc, la fonction 'insert' ne reçoit-elle pas un objet' dependency'? 'cuid' est juste une chaîne –