如何用std :: set包含我的类

时间:2011-12-16 05:09:15

标签: c++

我正在尝试用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;
}

5 个答案:

答案 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); }

如果两个边缘应该是“等效的”,那么以这样的“规范”格式记录它会更容易,压力也更小。

另一个问题是你正在测试平等,而不是低于其他人所解释的。