2016-10-14 4 views
2

私はdataは、ユーザー定義のクラスであり、setvector両方がSTLユーザ定義のデータ型のためにC++のセットにinsertを使用するには?

class data 
{ 
    int info; 
}; 

私たちはコンパレータを定義する必要があるかどうかを理解することはできませんよですset<vector<data>>を使用したいですvector<data>およびdataクラスのいずれか、またはdataクラスのみの演算子です。 そして同じようにコンパレータ演算子を定義するにはどうすればよいですか?

+5

本当に一連のデータベクトルが必要ですか?なぜあなたはそれをしたいのですか? – Danh

+1

セットは、2つの要素が同じかどうかを知る必要があります。同じ要素なので、重複した要素を格納しないためです。したがって、2つのベクトルが同じであるかどうかを判断する方法を提供する必要があります。これは、ベクトルと共通するものではありません。これは正しいことをしていないあなたの悲鳴です。 – xaxxon

+2

ここにXY問題の臭いがあります – Rerito

答えて

1

std::vectorには既に辞書順がありますので、通常は何もする必要はありません。

デフォルトのベクトル順序(必要でない場合は以下の例を参照)を使用する場合、常に独自のクラスの順序を定義する必要があり、最も一般的な方法はoperator<をオーバーロードすることです。

順序関係はstrict weak orderingである必要があります。また、この集合を使用することは未定義です。

セットに「等価」という特別な意味が必要な場合は、自分で定義する必要があります。

例えば

、このコードは、(それぞれの長さに遭遇するので、最初のものだけがセットに追加されている)に等しい長さのベクトルが等しいと見なされるセットになるだろう:このセットはdoesnのこと

template<typename T> 
struct shorter_vector 
{ 
    bool operator() (const std::vector<T>& left, const std::vector<T>& right) const 
    { 
     return left.size() < right.size(); 
    } 

}; 

// ... 
struct A { int x; }; 
std::set<std::vector<A>, shorter_vector<A>> samelengths; 
samelengths.insert({A{1}}); 
samelengths.insert({A{2}}); 
samelengths.insert({A{3},A{4}}); 
samelengths.insert({A{5},A{67}}); 
// set now contains {A{1}} and {A{3},A{4}} 

注等価関係は構造だけで定義されているため、ベクトルの要素の順序が必要です。

関連する問題