1,在set中嵌入结构体或自定义函数的时候需要使用 < 重载运算符。(map也一样)
注意:
重载的方式不同,所造成的影响,或者说set的功能就不同。
举个例子:
A
struct AC
{
int a,b;
bool friend operator <(AC m1,AC m2)
{
if(m1.a!=m2.a)
return m1.a<m2.a;
else
{
return m1.b<m2.b;
}
}
};
set<AC >s;
B
struct AC
{
int a,b;
bool friend operator <(AC m1,AC m2)
{
return m1.a<m2.a;
}
};
set<AC >s;
A和B都是用来模拟set内嵌pair。
即:set<pair<int,int> >s;
但A和B在查找上有很大的不同点:
对于A来说 (1,2)和(1,3)和(3,4)是三个不同的pair,如果在A中对(1,2)进行erase操作,可以写成s.erase((AC){1,2})
。
对于B来说(1,2)和(1,3)和(3,4)是两个不同的pair,如果在A中对(1, 2)进行erase操作,可以写成s.erase((AC){1,x})
。期中x为任意数字。
为什么会这样呢?其原因就是两者之间的 < 重载不同。
对于A来说,辨别不同的AC类型的结构体要关注a和b,但对于B来说,辨别只需要关注 a 。换而言之,就是在B中,只要a一样,两个结构体就一样。