lower_bound是大家很常使用的函数,但是在对容器使用时,尽量使用容器本身的lower_bound / upper_bound.

std::set::lower_bound与std::lower_bound的效率问题

这个问题可能大家觉得只差那么一点点,恰恰相反,两者效率相差大的几乎是天壤之别。

在最近的cf round359(div2)的D题里,我和标程解法一模一样,但是一个是700msAC但是我的程序却是3000ms,默默的TLE。 完全不科学。

经过仔细比对,我的程序里面二分是这样的:
这里写图片描述

但是标程是这样的:
这里写图片描述

完全难以相信他俩有任何区别。
我修改之后再次将我的程序提交:
这里写图片描述

果然是这个问题!

这个问题很困扰我,cppreference网站上并没有解释。某度上也搜不到任何信息。

所以上StackOverflow上搜了一下,果然有这个问题。

这里写图片描述

WOW这个就是我想问的,下面是回答:

这里写图片描述

这里写图片描述

我倒是觉得下面那个说的很有道理,应该是set<>::iterator不支持随机访问,所以直接当作普通的序列进行二分的时候就不是O(logn)的复杂度了。

所以,一定要使用std::set::lower_bound

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐