我正在尝试用C++语言编写程序.
Class Edge表示u和v之间的连接.
边缘a表示u和v之间的连接.边缘a'表示v和u之间的连接.边a和''表示相同的连接.所以,我想要包含一个或一个'.
我知道"set"存储了独特的元素.所以我想用这个.我在下面定义了operator <.
当我搜索bug时,我发现了一些虚拟现实.我存储(1,2) - >(1,2) - >(2,1) - >(3,2) - >(2,3) - >(5,2).
但是设置商店
1 2
5 2
3 2
1 2 <-- Why ????
Run Code Online (Sandbox Code Playgroud)
你可以帮帮我吗??
#include<iostream>
#include<set>
class Edge {
private:
int u, v;
public:
bool operator< (const Edge& e) const {
bool result = true;
if( (u == e.u && v == e.v) || (v == e.u && u == e.v) ) {
result = false;
}
return result;
}
std::pair<int, int> pair() const {
return std::pair<int, int>(u, v);
}
Edge(int u_, int v_) : u(u_), v(v_) {}
};
int main(void) {
std::set<Edge> edge;
std::set<Edge>::iterator eit;
edge.insert(Edge(1,2)); // <-- (1,2) can be contained.
edge.insert(Edge(1,2)); // <-- (1,2) doesn't have to be contained.
edge.insert(Edge(2,1)); // <-- (2,2) doesn't have to be contained.
edge.insert(Edge(3,2)); // <-- (3,2) can be contained.
edge.insert(Edge(2,3)); // <-- (2,3) doesn't have to be contained.
edge.insert(Edge(5,2)); // <-- (5,2) doesn't have to be contained.
edge.insert(Edge(1,2)); // <-- (1,2) doesn't have to be contained. But edge contains this. Why?
for(eit = edge.begin(); eit != edge.end(); eit++) {
std::cout << (*eit).pair().first << " " << (*eit).pair().second << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你operator<正在测试平等,而不是低于.尝试:
if (u < e.u)
result = true;
else if (e.u < u)
result = false;
else
result = (v < e.v);
Run Code Online (Sandbox Code Playgroud)
编辑:根据评论我误解了这个问题 - 该集合应该以任何顺序拒绝重复.比较运算符需要保持一致,所以这里可能有效.
if (min(u,v) < min(e.u,e.v))
result = true;
else if (min(e.u,e.v) < min(u,v))
result = false;
else
result = (max(u,v) < max(e.u,e.v));
Run Code Online (Sandbox Code Playgroud)