Как содержать мой класс с помощью std :: set

Я пытаюсь написать программу на языке C ++.

Граница класса указывает связь между u и v.

Граница a, которая указывает связь между u и v. Edge a ', которая указывает связь между v и u. Края a и a 'указывают на одно и то же соединение. Итак, я хочу содержать либо a, либо a '.

Я знаю, что «набор» хранит уникальные элементы. Итак, я хочу использовать это. Я определяю operator <ниже.

Когда я ищу ошибки, я обнаружил некоторые проблемы. Я сохраняю (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
задан rid 16 December 2011 в 05:11
поделиться