std::set
たくさんのエッジを投入し、ユニークなものだけを残す場所を使用しようとしています。
AnEdge
は、2 つの (整数インデックス付き) ノード間の線です。(1,2)==(2,1)
これらのエッジは無向であるため、Edge 。
しかし、これで不可解な状況に遭遇しています。//??
以下のコードでマークされているセクションでは、動作が期待どおりではありません。
このコードを実行した結果、(1,2) と (4,8) の 2 つのエッジのみが保持されます。(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();
}
}