set小记

2019.10.23

想用vector做CF1249D的,

结果TLE了,原因是insert()函数是O(n)插入的;

听说大佬们都是用的set,可我还不会,

于是我就打算用set做这道题,并从中学习set及迭代器的用法。

磨了一上午代码终于打完了,结果测样例就WA了,还错的莫名其妙。

然后调了一整天代码终于发现问题了:

我在结构体重定义'<'的时候只比较了其中一个变量的大小,

因为对于该问题其它变量的大小是无关紧要的。

但是set判断两个元素是否相同是通过比较大小来完成的,

我定义的'<'只比较了结构体中一个变量的大小,

因此只要这个变量相同,set即判定为相同元素,

由于set会去重,就把其它该变量相等的元素删掉了,

导致本来不同的结构体没有被放进集合,就出问题了。

另外在调试过程中还发现了set.end()返回的是一个计数的元素,

储存的是set.size()即set中元素的数量,

如果是一个结构体则把size存在第一个变量里面,

其它变量初始化为0(Windows中是这样,Linux就不知道了)。

最后吐槽一句:STL调试真难受啊,内部数据一个都看不了,

iterator迭代器都不知道下一个往哪跳,找问题还要大脑模拟计算过程。

好在这一下午的功夫没白费,还是学到了不少的。(终于真正会用迭代器了)

晚上写下这个小记进一步加深印象,算是set入门了吧。

(至少不像以前那样只记得有什么函数,使用起来一脸懵的样子了)

猜你喜欢

转载自www.cnblogs.com/AppleC/p/11728979.html