• [C++]set判断两个元素相等


    前言

    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;
    
    • 1
    • 2
    • 3
    • 4

    这是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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    代码如上,自定义了数据结构Node,其中Node没有重载等于运算符。
    并在每一次进行小于号运算时,进行一次输出。

    输出结果如下:

    —insert haha
    —insert lala
    do
    do
    —insert xixi
    do
    do

    因为小于运算符是对元素b进行比较的,所以使用小于号做判断的情况下,我们插入的三个元素值应该是相等的。
    从输出可以看出,对于在set中的单独一个元素做比较时,它确实如我们猜想使用了两次比较运算——在两个元素值不相等时,运算的次数会更多,这里不做验证。

    因此,结论成立。
    编译器版本:8.3.0

    参考文档:
    C++官方文档

  • 相关阅读:
    多元函数的微分法
    QT—3D绘图
    iommu=pt内核参数解析
    国自然中标越来越难,怎样才能赢在起跑线上?
    用信号量实现进程互斥, 同步, 前驱关系
    【HBZ分享】Netty的启动引导类Bootstrap
    <Linux系统复习>进程概念
    【自然语言处理(NLP)】基于LSTM的命名实体识别
    【带头学C++】----- 三、指针章 ---- 3.11 补充重要指针知识(二,拓展基础知识)
    Spring的后处理器
  • 原文地址:https://blog.csdn.net/qq_35630119/article/details/126325514