我试图了解地图如何工作以及如何为图表实现它们。我一直收到上面的错误。我认为这是因为'<'比不想要的数据要少。
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]);
}
}
};
答案 0 :(得分:4)
错误输出是因为您没有为operator<
类定义Node
(作为方法或非成员函数)。
看看here for operator overloading;由于map
按排序顺序存储密钥,因此必须实现operator<
才能使用。
示例实现可能是按val
排序,然后按name
排序,在这种情况下,您可以按以下方式排序:
#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);}