2016-11-04 2 views
0

マップの仕組みとグラフの実装方法を学習しようとしています。私は上記のエラーが発生し続けます。私はそれが '<'が想定していないデータよりも少なく取っていると仮定します。C2678バイナリ '<': 'const Node'型の左辺オペランドを取る演算子が見つかりません(または許容される変換はありません)

using namespace std; 


struct Node { 
    string name; 
    int val; 

    Node(string n) { 
     name = n; 
     val = 0; 
    } 

}; 

struct AdjList { 

    map<Node, list<Node*>> adj; 
    map<Node, list<Node*>>::iterator it; 
    int type; 

    AdjList(int a) { 
     type = a; 
    } 


    void add(Node temp) { 
     it = adj.end(); 
     list <Node*> hi; 
     adj.insert(pair <Node, list <Node*>>(temp, hi)); 
    } 

    void connect(Node *a, Node *b) { 
     adj.find(*a)->second.push_back(b); 
     if (type == 1) { 
      adj.find(*b)->second.push_back(a); 
     } 
    } 

    void connect(Node *a, vector <Node*> b) { 
     for (int i = 0; i < b.size(); i++) { 
      connect(a, b[i]); 
     } 
    } 
}; 

答えて

3

あなたは(法として、非メンバ関数のように)あなたのNodeクラスのoperator<を定義していなかったので、それが出erroringています。

見てくださいhere for operator overloading; mapはソート順にキーを格納するため、使用するにはoperator<を実装する必要があります。

実装例では、として実装するだろう。その場合には、nameによって、その後valでソートすることがあります

#include <tuple> 

inline bool operator==(const Node& lhs, const Node& rhs){ 
    return lhs.val == rhs.val && lhs.name == lhs.name; 
} 
inline bool operator!=(const Node& lhs, const Node& rhs){return !operator==(lhs,rhs);} 
inline bool operator< (const Node& lhs, const Node& rhs){ 
    // std::tuple's lexicographic ordering does all the actual work for you 
    // and using std::tie means no actual copies are made 
    return std::tie(lhs.val, lhs.name) < std::tie(rhs.val, rhs.name); 
} 
inline bool operator> (const Node& lhs, const Node& rhs){return operator< (rhs,lhs);} 
inline bool operator<=(const Node& lhs, const Node& rhs){return !operator> (lhs,rhs);} 
inline bool operator>=(const Node& lhs, const Node& rhs){return !operator< (lhs,rhs);} 
+0

あなたが*必須* 'のstdとして、あなたのクラスを使用するように定義するだけ演算子を:: mapキーは '<'です - 他のものはあなたにとって有益かもしれませんが、 'std :: map'では使われません。 –

+0

@ChrisDodd:Yar。他のすべてのプログラマを実装したのは、他のプログラマが使用するのを難しくしているからです。すべてを実装するのは良い方法ですが、私が言ったように、 'map'は' operator <'を必要としますそれは単に 'operator <'について気にしていた)。他の4つの演算を 'operator =='と 'operator <'の形で定義するのがどれほど簡単かを示す機会は常に取らなければなりません。 :-) – ShadowRanger

+0

私はあなたがどのようにオブジェクトを "ソート"するのかは分かりません。それはオブジェクトのアドレスに基づいてソートされますか?この場合ノードが空の場合と同様に、 "<"演算子はどのように実装されますか? – lyph

関連する問題

 関連する問題