【发布时间】:2015-03-11 14:44:35
【问题描述】:
在排序容器中是否有一个单行来查找小于某个元素 x 的最大元素?我基本上对任何可以给我一个指向小于 x 的最大元素的迭代器的代码感兴趣。
我知道如何自己编写代码,但希望有一个库函数...
编辑:也许我应该在这里澄清一下,我想到的我自己编写代码的版本是基于二进制搜索的,因此在 O(log n) 时间内运行。我需要为包含数百万个元素的列表计算此值。
【问题讨论】:
-
std::max_element(container.begin(), std::lower_bound(container.begin(), container.end(), x)); -
这是 O(log n) 复杂度,任何基于二进制搜索的方法都可以提供吗? (即我自己编写的版本,因为容器已排序)
-
这会更快,即使不是那么优雅:
auto bound = std::lower_bound(container.begin(), container.end()); if (bound != container.begin()) --bound; else bound = container.end();}基本上,找到一个元素的位置x或更大,降低一个位置(注意边缘条件) .这只会执行一次二分搜索。 -
@JT1 用于排序容器,是的,提供的解决方案是 O(log(n))