我正在尝试使用一个std::set
我将放入一堆边缘的地方,并且只保留独特的边缘。
AnEdge
是两个(整数索引)节点之间的一条线。Edge (1,2)==(2,1)
,因为这些边是无向的。
不过,我遇到了一个令人费解的情况。在下面代码中标记的部分//??
,行为与我预期的不同。
运行此代码的结果是只保留 2 条边,(1,2) 和 (4,8)。(2,1) 被集合丢弃,但除非我激活注释掉的//|| ( A==o.B && B==o.A )
部分operator==
!这里发生了什么?
这个set<Edge>
实现让我感觉......前卫。
#include <stdio.h>
#include <set>
using namespace std ;
struct Edge
{
int A,B ;
Edge( int iA, int iB ) : A(iA), B(iB) {}
bool operator==( const Edge & o ) const {
//??
return ( A==o.A && B==o.B ) ;//|| ( A==o.B && B==o.A ) ;
}
bool operator<( const Edge& o ) const {//MUST BE CONST
return A < o.A && B < o.B ;
}
void print() const { printf( "( %d, %d )", A,B ) ; }
void compare( const Edge& o ) const {
print() ;
if( *this==o ) printf( "==" ) ;
else printf( "!=" ) ;
o.print() ;
puts("");
}
} ;
int main()
{
Edge e1( 1, 2 ) ;
Edge e2( 1, 2 ) ;
Edge e3( 2, 1 ) ;
Edge e4( 4, 8 ) ;
e1.compare( e2 ) ;
e1.compare( e3 ) ;
e1.compare( e4 ) ;
set<Edge> edges ;
edges.insert( e1 ) ;
edges.insert( e2 ) ;
edges.insert( e3 ) ;
edges.insert( e4 ) ;
printf( "%d edges\n", edges.size() ) ;
for( auto edge : edges )
{
edge.print();
}
}