2017-09-18 2 views
2

Ich habe die folgende Struktur:C++: Wie um zu überprüfen, dass ein Objekt mit einer bestimmten Eigenschaft besteht in einem Satz

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; 
}; 

Jetzt mag ich Objekte dieser Struktur in einem Satz einzufügen. Ich habe Objekte mit der gleichen CUid aber (wichtig!) Die anderen Eigenschaften (sink, source, var) können abweichen. Ich möchte verhindern, dass Objekte mit demselben CUid in das Set eingefügt werden. Der einzige Weg, den ich kenne, besteht darin, durch die Menge zu iterieren und jedes Objekt der CUid zu überprüfen. Gibt es einen besseren Weg mit weniger Code, um das zu überprüfen?

+1

einen benutzerdefinierten Komparator Verwenden Sie für die [ 'std :: Set'] (http://en.cppreference.com/w/cpp/container/set), der prüft, die 'CUid'? –

+1

Definieren Sie einen benutzerdefinierten Vergleicher (oder überschreiben Sie möglicherweise den Operator '<' Ihrer 'struct'), die nur die' CUid' im Vergleich verwendet. Beispiel [hier] (https://stackoverflow.com/questions/16894700/c-custom-compare-function-for-stdsort). – hnefatl

Antwort

4

Sie können einen benutzerdefinierten Vergleicher verwenden, der die Reihenfolge definiert, in der Ihre Objekte in dem Satz gespeichert werden.

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

und dann

std::set<dependence,cmp> myset; 

Nun, wenn Sie versuchen, Objekte mit gleichen CUid einzufügen, nur die erste Instanz wird in myset gehen.

EDIT:

Ein anderer Weg wäre < Betreiber zu überlasten.

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

} 

und dann

std::set<dependence> myset; 
+0

Darüber hinaus können Sie wissen, ob es zuvor im Set vorhanden war, indem Sie 'myset.insert (cuid) .second' chippen. Es ist ein 'bool', der auf" true "gesetzt wird, wenn er eingefügt wird, und auf" false ", wenn er vorher existiert. – Caduchon

+0

@YSC Nur hinzugefügt. –

+0

@Caduchon Wie kann ich 'myset.insert (cuid) .second' verwenden? Meine Menge ist eine Menge von 'Abhängigkeits'-Objekten. Erhält die 'insert'-Funktion also kein' dependency'-Objekt? 'cuid' ist nur eine Zeichenfolge –

Verwandte Themen