java map存储结构体_用set、map等存储自定义结构体时容器内部判别各元素是否相同的注意事项...

STL作为通用模板极大地方便了C++使用者的编程,因为它可以存储任意数据类型的元素

如果我们想用set与map来存储自定义结构体时,如下

structpp

{doublexx;doubleyy;

};set aa[25];structab

{doubleaa;doublebb;doublecc;

}stra[25];

map mm;

上面我们使用 set 来存储 pp结构体,将 ab结构体作为一个映射的Key

显然我们这样做编译器会报错,原因是set与map内部需要比较各个元素的大小,这样我们的结构体缺失了小于号的重载,无法存储

改后如下:

structpp

{doublexx;doubleyy;bool operator < (const pp a)const //重载小于号

{return xx

}

};set st;structab

{doubleaa;doublebb;doublecc;bool operator < (const ab a)const //重载小于号

{return aa

}

};

map mp;

这样用通过结构体中的某个数比较来定义结构体的小于号,我们的程序就编译成功了

但在运行时我们就会发现一个现象,那就是如果我们

将一个pp结构体

A(A.xx == 1, A.yy == 2)

插入集合st之后

我们若再插入一个pp结构体

B(B.xx == 1,B.yy == 3)

后面检查时会发现,集合中只有A而没有B,但插入insert操作是确实执行过的

那么原因应该只有一个,就是set内部将A与B视为同一个元素,由于set的去重性,第二次加入B不成功。

为何会认为A,B相同?注意到我们的小于号重载

bool operator < (const pp a)const //重载小于号

{return xx

}

要知道上面我们仅仅用pp结构体成员xx来定义小于号,所以由于A,B的xx相同(都是1),set内部认为A,B相同(即使A,B的yy值不相同)

类似地,我们如果给map里面加上两对 “键-值”

而这两个键(都是ab结构体)的成员aa相同而bb与cc不相同的话

我们的mp映射里面也会只有一对“键-值”,(而且值是后一个加入的值覆盖掉了前面的值)

解决方法就是修改小于号重载函数,使得结构体成员有一个不相同时,return后面的表达式就不能相等

举例如下

structpp

{doublexx;doubleyy;bool operator < (const pp a)const{return xx * yy - xx / yy + yy / 2.745 < a.xx * a.yy - a.xx / a.yy + a.yy / 2.745; //用于集合的必备操作

}

};set aa[25];structab

{doubleaa;doublebb;doublecc;bool operator < (const ab a)const{return aa * cc / 5.123 + bb / 3.145 - aa < a.aa * a.cc / 5.123 + a.bb / 3.145 - a.aa;//用于映射的必备操作

}

}

map mm;

可看出,新的重载方式囊括了结构体内部的所有成员,并且使用了三位小数,确保了只有在两个结构体内部成员完全一样时容器内部才会判为相同元素,出现错误的概率被降到极低。

所以可以在表面现象上确定的是,set与map内部不仅用小于号来判断元素大小,而且也用它来判断元素是否相同

保证重载小于号的返回表达式的比较值对于不同元素具有真正的辨别性,是用这些容器来装载自定义结构体所需要注意的事项

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值