Gök*_*hin 0 c++ std stdset c++11
我有以下Edge课程:
class Edge {
public:
int src, dest;
bool operator== (const Edge &edge) const {
return ((src == edge.src) && (dest == edge.dest)) || ((src == edge.dest) && (dest == edge.src));
}
bool operator<(const Edge& edge) const {
return !(((src == edge.src) && (dest == edge.dest)) || ((src == edge.dest) && (dest == edge.src)));
}
Edge(int src, int dest) {
this->src = src;
this->dest = dest;
}
};
Run Code Online (Sandbox Code Playgroud)
覆盖<运算符的要点是,当我尝试使find集合中的边Edge(0, 1)等于 时Edge(1, 0)。但是,以下测试代码无法执行此操作并std::find返回一个甚至不存在的边:
Edge edge(0, 3);
set<Edge> test;
test.insert(Edge(3, 1));
test.insert(Edge(3, 0));
auto a = test.find(edge);
cout << a->src << " " << a->dest << endl;
Run Code Online (Sandbox Code Playgroud)
这会奇怪地打印出来2 0。我不知道为什么,我是 C++ 的新手,任何帮助表示赞赏。
您当前没有有效的Compare for std::set,因此您的程序具有未定义的行为。
这是一种与您的兼容 ==
bool operator<(const Edge& edge) const {
return std::minmax(src, dest) < std::minmax(edge.src, edge.dest);
}
Run Code Online (Sandbox Code Playgroud)
这也可用于简化您的 ==
bool operator==(const Edge& edge) const {
return std::minmax(src, dest) == std::minmax(edge.src, edge.dest);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |