How to contain my class with std::set
<p>I'm trying to write a program in C++ language.</p>

<p>Class Edge indicates the connection between u and v.</p>

<p>Edge a which indicates the connection between u and v. Edge a' which indicates the connection between v and u. Edge a and a' indicate same connection. So, I want to contain either a or a'.</p>

<p>I know "set" stores unique elements. So I want to use this. I define operator&lt; below.</p>

<p>When I search bugs, I found some trubles.
I store (1,2) -> (1,2) -> (2,1) -> (3,2) -> (2,3) -> (5,2). </p>

<p>But set stores</p>

<pre><code>1 2
5 2
3 2
1 2 &lt;-- Why ????
</code></pre>

<p>Could you help me??</p>

<pre><code>#include&lt;iostream&gt;
#include&lt;set&gt;

class Edge {

private:
  int u, v;

public:
  bool operator&lt; (const Edge&amp; e) const {
    bool result = true;
    if( (u == e.u &amp;&amp; v == e.v) || (v == e.u &amp;&amp; u == e.v) ) {
      result = false;
    }
    return result;
  }

  std::pair&lt;int, int&gt; pair() const {
    return std::pair&lt;int, int&gt;(u, v);
  }

  Edge(int u_, int v_) : u(u_), v(v_) {}
};

int main(void) {
  std::set&lt;Edge&gt; edge;
  std::set&lt;Edge&gt;::iterator eit;

  edge.insert(Edge(1,2)); // &lt;-- (1,2) can be contained.
  edge.insert(Edge(1,2)); // &lt;-- (1,2) doesn't have to be contained.
  edge.insert(Edge(2,1)); // &lt;-- (2,2) doesn't have to be contained.

  edge.insert(Edge(3,2)); // &lt;-- (3,2) can be contained.
  edge.insert(Edge(2,3)); // &lt;-- (2,3) doesn't have to be contained.
  edge.insert(Edge(5,2)); // &lt;-- (5,2) doesn't have to be contained.

  edge.insert(Edge(1,2)); // &lt;-- (1,2) doesn't have to be contained. But edge contains this. Why?

  for(eit = edge.begin(); eit != edge.end(); eit++) {

    std::cout &lt;&lt; (*eit).pair().first &lt;&lt; " " &lt;&lt; (*eit).pair().second &lt;&lt; std::endl;
  }

  return 0;
}
</code></pre>
