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);