set 容器是 C++ 标准库中的一个关联容器,它存储的元素是唯一的,并且默认按照升序排列。当 set 容器存储自定义数据类型时,我们需要为这些类型定义排序规则。默认情况下,set 容器会使用 < 运算符来确定元素间的顺序,但对于自定义类型,我们可能需要定义自己的比较逻辑。
为了指定自定义数据类型的排序规则,我们可以为 set 容器提供一个比较函数对象或 lambda 表达式作为模板参数。比较函数对象或 lambda 表达式应该接受两个自定义类型的参数,并返回一个布尔值来表示这两个元素的大小关系。
下面,我将通过一个具体的例子来详细讲解如何为 set 容器中的自定义数据类型指定排序规则。
自定义数据类型
首先,我们定义一个简单的自定义数据类型 Person,它包含姓名和年龄两个属性。
在这个例子中,我们为 Person 类型重载了 < 运算符,以便在需要默认排序时使用。但请注意,这并不意味着我们必须重载 < 运算符才能为 set 提供自定义排序规则。实际上,我们可以完全忽略这个重载,并通过为 set 提供自定义比较函数对象来定义排序逻辑。
自定义排序规则
现在,假设我们想要根据 Person 的姓名对 set 中的元素进行排序,而不是年龄。为了实现这一点,我们可以定义一个比较函数对象或 lambda 表达式。
使用比较函数对象
在这个例子中,我们定义了一个名为 NameComparator 的比较函数对象,它接受两个 Person 对象作为参数,并根据它们的姓名进行比较。然后,在创建 set 容器时,我们将 NameComparator 作为第二个模板参数传递,以指定按姓名排序的规则。
使用 lambda 表达式(C++11 及以后版本)
从 C++11 开始,我们还可以使用 lambda 表达式来定义比较逻辑,这使得代码更加简洁。
在这个例子中,我们使用了一个 lambda 表达式作为 set 容器的比较函数。decltype 关键字用于推断 lambda 表达式的类型,并将其作为模板参数传递给 set。lambda 表达式本身接受两个 Person 对象,并根据它们的姓名进行比较。