作者寄语:学习中总结的一些问题,难免有纰漏,欢迎探讨!
一.问题描述
在实际编码中我们经常会碰到“
比较两个结构体是否相同
”“
比较两个类对象是否相同
”等类型的比较,总的来说就是比较
非基本类型
的数据。这种比较在在c++语言中并
没有内建也没法内建,
所以需要我们
重载比较操作符
并
自定义比较规则,
那么我们怎么自定义比较规则呢
;
二.解决思路
默认情况下,C++仅支持基础数据类型,如int, float等类型的直接比较,结构体对象无法直接比较。
不过C++的结构体可以说是类(class)的另一种形式。所以在定义了比较运算符对应的重载函数后,可以直接比较。比较的结果为对应运算符重载的返回值。
实现上述比较基本上有两个步奏:
第一
:重载比较操作符(关系运算符);
第二:
自定义比较规则;
1.重载比较操作符(关系运算符)
如结构体类型为test,那么要实现==的直接比较,有两种方法:
(1)在struct test中增加成员函数
bool operator == (const test & value) const;
(2)在全局函数中,增加
boot operator == (const test &v1, const test &v2);
2.自定义比较规则
自定义比较规则就是指比较规则自己定,那么就要考虑怎么定义大小,如下例子:
typedef struct Test
{
int a;
int b;
bool k;
}
Test test1,test2;
如果要比较上述的结构体,如要比较test1,test2的大小,我们要定义如何比较的规则:
(1)
test1和test2的关系(<,>,=)只与test1.a和test2.a的大小关系相关,比如:
只要test1.a<或>或=test2.a,就判定test1<或>或=test2;(
部分比较
);
(2)
test1和test2的关系(<,>,=)与test1.a和test2.a的大小关系以及test1.b和test2.b相关,比如:
1)当test1.a!=test2.a时,只比较test1.a和test2.a来判定test1和test2的关系;
2)当test1.a==test2.a时,比较test1.b和test2.b来判定test1和test2的关系;
if (
test1.a ==
test2.a)
{
return
test1.b<
test2.b;
}
return
test1.a <
test2.a;
(3)
test1和test2的关系(<,>,=)与test1.a和test2.a的大小关系以及test1.b和test2.b以及test1.k和test2.k相关,与第二种情况相同;
例:
struct STest
{
EA eA;
EB eB;
INT64 nTest1;
INT64 nTest2;
bool operator < (const STest& sTest) const
{
if (eA == sTest.eA)
{
if (eB == sTest.eB)
{
if (nTest1 == sTest.nTest1)
{
return nTest2 < sTest.nTest2;
}
return nTest1 < sTest.nTest1;
}
return eB < sTest.eB;
}
return eA < sTest.eA;
};