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

Aki*_*chi 5 c++

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

Mar*_*som 5

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)