我正在尝试用C ++语言编写程序。
Class Edge表示u和v之间的连接。
边缘a表示u和v之间的连接。边缘a'表示v和u之间的连接。边a和''表示相同的连接。所以,我想要包含a或'。
我知道“set”存储了独特的元素。所以我想用这个。我定义了运算符<下方。
当我搜索错误时,我发现了一些虚拟现实。 我存储(1,2) - > (1,2) - > (2,1) - > (3,2) - > (2,3) - > (5,2)。
但设置商店
1 2
5 2
3 2
1 2 <-- Why ????
你能帮帮我吗?
#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;
}
答案 0 :(得分:5)
你的operator<
正在测试平等,而不是低于。尝试:
if (u < e.u)
result = true;
else if (e.u < u)
result = false;
else
result = (v < e.v);
编辑:根据评论,我误解了这个问题 - 该套装应该以任何顺序拒绝重复。比较运算符需要保持一致,所以这里可能有效。
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));
答案 1 :(得分:3)
您operator <
实现更像是一个平等实现。尝试做词法而不是实现:
bool operator< (const Edge& e) const
{
return (u < e.u) || (u == e.u && v < e.v);
}
答案 2 :(得分:0)
您的运营商&lt;需要改进。如果它没有一致地订购商品,那么设置和映射会做坏事。
尝试
bool operator< (const Edge& e) const {
return pair() < e.pair();
}
答案 3 :(得分:0)
在您返回之前添加以下代码。原因在于其他答案。
if(result)
{
return u < e.u;
}
答案 4 :(得分:0)
您应该考虑将Edge构造函数更改为:
Edge(int u_, int v_) : u(u_), v(v_) { if (u>v) swap(u,v); }
如果两个边缘应该是“等效的”,那么以这样的“规范”格式记录它会更容易,压力也更小。
另一个问题是你正在测试平等,而不是低于其他人所解释的。