2017-09-18 20 views
2

に存在することを確認するために私は次の構造を有する:C++:どのように特定のプロパティを持つオブジェクトがセット

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

は今、私はセットでは、この構造のオブジェクトを挿入します。他のプロパティ(sinksourcevar)が異なる場合がありますが、同じ(CUid)のオブジェクトを持っていますが(重要!)私は同じCUidのオブジェクトをセットに挿入しないようにしたい。だから私が知っている唯一の方法は、セットを反復し、CUidの各オブジェクトをチェックすることです。それをチェックするコードが少なくて済むように、より良い方法がありますか?

+1

[ 'のstd :: set'(http://en.cppreference.com/w/cpp/container/set)をチェックするためのカスタムコンパレータを使用'CUid'? –

+1

比較で 'CUid'だけを使用するカスタムコンパレータを定義します(または' struct'の '<'演算子をオーバーライドするかもしれません)。例[ここ](https://stackoverflow.com/questions/16894700/c-custom-compare-function-for-stdsort) – hnefatl

答えて

4

オブジェクトがセットに格納される順序を定義するカスタムコンパレータを使用できます。

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

、その後

std::set<dependence,cmp> myset; 

あなたが同じCUidでオブジェクトを挿入しようとした場合さて、最初のインスタンスのみがmysetに行きます。

EDIT:

もう一つの方法は、<演算子をオーバーロードすることです。

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

} 

、次いで

std::set<dependence> myset; 
+0

さらに、myset.insert(cuid).second'をchckingすることで、以前にセットに存在していたかどうかを知ることができます。挿入された場合は 'true'に設定され、以前に存在する場合は' false'に設定されます。 – Caduchon

+0

@YSCちょうどそれを追加しました。 –

+0

@Caduchonどのように 'myset.insert(cuid).second'を使うことができますか?私のセットは '依存性'オブジェクトのセットです。 'insert'関数は' dependency'オブジェクトを受け取りませんか? 'cuid'は単なる文字列です –

関連する問題