C++的set是如何判断两个数是否相等的呢?
template < class T, // set::key_type/value_type
class Compare = less<T>, // set::key_compare/value_compare
class Alloc = allocator<T> // set::allocator_type
> class set;
这是set的官方声明。 不能发现,当T为自定义数据类型时,我们只需要自定义其小于运算即可,无需重载等于号。
因此可推测,set使用小于运算实现对两个数是否相等的判断,进而实现去重。
对于两个数a,b,如果有
a
<
b
a < b
a<b 和
b
<
a
b < a
b<a 同时成立,那么即有
a
=
b
a=b
a=b。
因此我们只需要执行两次小于运算,即可判断两个数值是否相等。
而如果set判断两个数是否相等的操作并非我们猜想的小于运算(如使用等于号运算),那么无需对两个数进行多次比较,且去重的结果可能始料不及。
#include
#include
#include
using namespace std;
struct Node{
string a;
int b;
const bool operator<(const Node &B) const {
cout << "do" << endl;
return this->b < B.b;
}
};
int main(){
set<Node> S;
cout << "---insert haha" << endl;
S.insert({"haha",12});
cout << "---insert lala" << endl;
S.insert({"lala",12});
cout << "---insert xixi" << endl;
S.insert({"xixi",12});
return 0;
}
代码如上,自定义了数据结构Node,其中Node没有重载等于运算符。
并在每一次进行小于号运算时,进行一次输出。
输出结果如下:
—insert haha
—insert lala
do
do
—insert xixi
do
do
因为小于运算符是对元素b进行比较的,所以使用小于号做判断的情况下,我们插入的三个元素值应该是相等的。
从输出可以看出,对于在set中的单独一个元素做比较时,它确实如我们猜想使用了两次比较运算——在两个元素值不相等时,运算的次数会更多,这里不做验证。
因此,结论成立。
编译器版本:8.3.0
参考文档:
C++官方文档