2012-05-02 49 views
0

は、私は、そのキーと値の両方の構造体(STEとSTR)があるマップを作成しようとしているので、私はこのようなものがあります:C++で構造体としてkeyとvalueを使用してマップを作成する方法は?

struct stR{ 
    char* est; 
    char* et;  
}; 

struct stE{ 
     int num; 
     char* form; 
     char* et; 
     map<stE,stR> s; 
}; 

をしかし、私は新しい要素を挿入したいとき

stE e; 
e.num=1; 
e.form="a"; 
e.et="b"; 

stE f; 
f.num=2; 
f.form="c"; 
f.et="d"; 

stR r; 
r.est="e"; 
r.et=""; 

e.s.insert(make_pair(f, r)); 

それは私にエラーを与える:

C:\Dev-Cpp\include\c++\3.4.2\bits\stl_function.h In member function `bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = stEstado]':

私が問題だものを見つけることができません。誰か助けてくれますか? ありがとうございます。

+1

可能な重複http://stackoverflow.com/questions/1102392/stl-maps-:あなたは小なりの比較を実装しようとすると、これは、再帰問題を引き起こす可能性がありますユーザー定義オブジェクト付き)などがあります。 – juanchopanza

答えて

3

マップを使用する場合は、小数点以下の演算子を指定するか、キーを自動的に並べ替えるため、比較演算子を指定する必要があります。

bool stE::operator< (const stE &); 
+2

あなたはそれを必要とするか、コンパレータクラスを宣言して、 'struct stE'の定義の' map <...> 'の3番目のテンプレート引数として与える必要があります。 –

3

あなたstEためoperator<を定義するか、マップテンプレートパラメータとしてファンクタのコンパレータ機能を渡すことで、あなたが達成することができますstrict weak ordering comparisonを提供する必要があります。 CompareT::operator<(const T&)を使用するように設定され、デフォルトで

template<class Key, class T, class Compare = std::less<Key>, ... > class map; 

ていますが、ロジックを実装する独自のファンクタの型を渡すことができます。std::mapは次のようになります。実際のクラスを変更できない場合は、これが重要です。

マップは、デフォルトで構築されたstRオブジェクトを挿入できる必要があります。現在の構造体にはデフォルトのコンストラクタがありません。ポインタはランダムな値に初期化されます。これはさらに線に沿って問題になる可能性があります。

また、キー構造体には独自のキー型のマップがあります。

struct stE{ 
    int num; 
    char* form; 
    char* et; 
    map<stE,stR> s; // how do we use this in the comparison? 
}; 
[ユーザー定義オブジェクトとSTLマップ](の
+0

std :: mapでは、value_typeがデフォルトで構成可能である必要はありません(一般的に)。 'map s;'メンバは、この時点でstEが不完全であるため問題になりますが、これは不正です(すべての実装が実際にそれを拒否するわけではありません)。 – ymett

+0

@ymettマップの演算子[]がマップに存在しないキーに対して呼び出された場合、その値はデフォルトで構築されます。不完全なタイプについては、私は標準をチェックしなければならない。 GCCは苦情なしでそれを飲み込んでいるようです:-) – juanchopanza

+0

operator []を使用したい場合は、value_typeはデフォルトで構築可能でなければなりません。多くの実装では、実際には不完全な型が受け入れられますが、標準では定義されていません。 – ymett

関連する問題