かなり困ってるので助けてもらえると助かります.
STLのsetは要素を重複なく格納できるのが特徴だと思っているのでそれを自作クラスに使おうとしました.
Edgeクラスはxy座標を格納するのですが,(1,2),(2,1)は同じ要素として考えてどちらか一方のみ格納したいです.
入力で(1,2)->(1,2)->(2,1)->(3,2)->(2,3)->(5,2)までは,正しく重複なく格納できるのですが,最後に(1,2)を登録すると
1 2
5 2
3 2
1 2
このように格納されていることがわかりました.
なぜ最後の(1,2)が重複チェックをくぐりぬけて格納されるのでしょうか?
#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;
}