使用STL查找小于当前的最大元素

时间:2015-01-13 15:28:36

标签: c++11 stl

在排序容器中是否有单个单行查找小于某个元素x的最大元素?我基本上对任何会给我一个迭代器的代码感兴趣,该迭代器指向小于x的最大元素。

我知道如何自己编写代码,但希望它有一个库函数...

编辑:也许我应该在这里说清楚,我记得我自己编码的版本是基于二进制搜索,因此在O(log n)时间运行。我需要为最多有几百万个元素的列表计算这个。

4 个答案:

答案 0 :(得分:4)

由于您的容器已排序,您可以在以第一个元素大于最大值结尾的范围内使用std::max_element,使用带有lambda的std::find_ifstd::lower_bound来获取此范围:

int main()
{
    std::set<int> s{ 3, 1, -14, 1, 5, 9 }; 
    std::set<int>::iterator result;

    int max_value = 6;
    result = std::max_element(std::begin(s), std::find_if(std::begin(s), std::end(s), [&](int i) { return i >= max_value; } ) );
    std::cout << "max element is: " << *result;
}

输出

  

最大元素是:5

Live Demo

std::lower_bound

int main()
{
    std::set<int> s{ 3, 1, -14, 1, 5, 9 }; 
    std::set<int>::iterator result;

    int max_value = 6;
    result = std::max_element(std::begin(s), std::lower_bound(std::begin(s), std::end(s), max_value)) ;
    std::cout << "max element is: " << *result;
}

<强> Live Demo

答案 1 :(得分:2)

结合使用prev()lower_bound()

  • mycontainer.lower_bound(int_val)将迭代器返回等于或大于int_val的数字

  • *prev(mycontainer.lower_bound(int_val))返回容器中int_val之前的值

作为防御检查,首先确认它不在容器的开头:

int result = -1, target = 15;
set<int> _container;
auto _iterator = _container.lower_bound(target);
if(_iterator != _container.begin())
   result = *std::prev(_iterator);

答案 2 :(得分:1)

您可以使用

lower_bound(container.begin(), container.end(), currentElement);

现在,如果该元素与container.begin()不同,则存在一个小于您当前元素的元素,只需减去一个就可以了。如果您确定总有这样的元素,那就做

lower_bound(container.begin(), container.end(), currentElement) - 1;

编辑:当然,我认为您的迭代器是双向的。

答案 3 :(得分:0)

假设您的数据位于一组s个整数中,则可以找到小于x的最大元素,如下所示:

auto it = s.lower_bound( x ); // s.lower_bound has a complexity of O(logn)
if( it == s.begin() )
{
    cout << "No element found" << "\n";
}
else
{
    --it;
    cout << *it << "\n";
}

lower_bound本质上将返回一个迭代器it,该迭代器指向最小的元素>= x。因此,仅前一个指针--it会指向最大的元素< x。这种方法的复杂性是O(log n)