set::find 查找不存在的元素

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++ 的新手,任何帮助表示赞赏。

Cal*_*eth 7

您当前没有有效的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)