c++ 小技巧,set 重载比较函数

c++ 小技巧,set 重载比较函数

smwtcat

·

2022-09-13 09:38:55

·

个人记录

卧槽,我才发现 set 的重载运算符是可以另写一个 struct 的。具体来说(https://www.cnblogs.com/zhihaospace/p/12843802.html):

set 容器模版需要3个泛型参数,如下:

template class set;

第一个T 是元素类型,必选;

第二个C 指定元素比较方式,缺省为 Less, 即使用 < 符号比较;

第三个A 指定空间分配对象,一般使用默认类型。

因此:

(1) 如果第2个泛型参数你使用默认值的话,你的自定义元素类型需要重载 < 运算操作;

(2)如果你第2个泛型参数不使用默认值的话,则比较对象必须具有 () 操作,即:

bool operator()(const T &a, const T &b)

也就是说可以,struct cmp{ bool operator() (int a, int b){ return id[a] < id[b]; } };,然后 set s;。

卧槽这个太猛了啊。

顺便,priority_queue 也可以这么干。好像要写 , cmp> 吧。

c++ 内置的 less 和 greater 也是一样的道理。所以可以 set< int, greater >,从大到小。

然后还有有意思的事,虽然跟这个无关:set.insert() 是有返回值的,类型是 pair。.first 表示插入元素的迭代器,.second 表示是否插入成功,即是否没有重复元素。这个也很厉害!

2022.10.2 更新:

这个叫做仿函数,就是让一个 class 或者 struct 具有函数的特性,能像函数一样用。