• [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++官方文档

  • 相关阅读:
    SpringBoot 刷新上下文2--执行BeanDefinitionRegistryPostProcessor
    服务治理:几种开源限流算法库/应用软件介绍和使用
    C++继承(2)
    LeetCode_栈_困难_1106.解析布尔表达式
    Qt实战案例(58)——利用QObject类实现定时器功能
    Hexagon_V65_Programmers_Reference_Manual(7)
    MySQL常用函数大全
    零基础学Java(6)控制流程
    (第24天)【leetcode题解】二叉树的层序遍历
    数据分析1-matplotlib
  • 原文地址:https://blog.csdn.net/qq_35630119/article/details/126325514