C++ 我缺失的边缘在哪里?

C++ 我缺失的边缘在哪里?,c++,set,C++,Set,我正在尝试使用一个std::set,在这里我将抛出一堆边,只保留唯一的边 边是两个(整数索引)节点之间的一条线。边(1,2)=(2,1),因为这些边是无方向的 不过,我遇到了一个令人困惑的情况。在下面代码中标记为/??的部分,行为与我预期的不同 运行此代码的结果是只保留2条边(1,2)和(4,8)。(2,1)被集合丢弃,但是它不应该是,除非我激活了操作符==中注释掉的/| |(A==o.B&&B==o.A)部分!这里发生了什么 这个集的实现让我感觉。。急躁的 #include <stdio

我正在尝试使用一个
std::set
,在这里我将抛出一堆边,只保留唯一的边

边是两个(整数索引)节点之间的一条线。边
(1,2)=(2,1)
,因为这些边是无方向的

不过,我遇到了一个令人困惑的情况。在下面代码中标记为
/??
的部分,行为与我预期的不同

运行此代码的结果是只保留2条边(1,2)和(4,8)。(2,1)被集合丢弃,但是它不应该是,除非我激活了
操作符==
中注释掉的
/| |(A==o.B&&B==o.A)
部分!这里发生了什么

这个
的实现让我感觉。。急躁的

#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();
  }
}
#包括
#包括
使用名称空间std;
结构边
{
INTA,B;
边(intia,intib):A(iA),B(iB){}
布尔运算符==(常数边和o)常数{
//??
返回(A==o.A&B==o.B);//| |(A==o.B&B==o.A);
}

bool操作符我相信您的
操作符我建议您更改Edge()构造函数,以确保A和B始终被初始化,这样
AC++集就不会像关心
=
操作符那样关心您的
您的比较应该是正确的

return (A == o.A && B == o.B) || (B == o.A && A == o.B);

@HunterMcMillen也是
是的,在最终的实现中,我只是在想为什么(2,1)在
集合中被忽略了,当它被注释掉的时候。嗯。
(1,2)
是错误的,
(2,1)
也是错误的。
(1,2)
“平等”(因此在你的情况下是双重的)在STD容器项比较中,当<代码>左>右>代码>和<代码>右>左< /代码>返回false。因此,重要的是(实际上,需要),您的比较器执行严格的排序。在建立<代码>操作符WOW时考虑此问题。很棒的答案。我只是重写了构造函数,<代码> A= min(IA,IB);B= MAX。(iA,iB);
效率奖励积分!当然,这意味着
A
B
内部
Edge
对象需要是受保护的成员,必须编写
set
函数,但出于我的目的,它们无论如何都不会被更改。
bool operator<( const Edge& o ) const {
    int myMin = min(A, B);
    int myMax = max(A, B);
    int hisMin = min(o.A, o.B);
    int hisMax = max(o.A, o.B);
    return myMin < hisMin || ( myMin == hisMin && myMax < hisMax );
}
return (A == o.A && B == o.B) || (B == o.A && A == o.B);