下限上限给出相同的结果

lower bound upper bound giving same results

本文关键字:结果      更新时间:2023-10-16

>我试图在排序数组中找到最接近的值,但upper_bound和lower_bound都给出了最高的值。

float abc[] = {1,3,4,5,6,7,8,9};
float *a  = lower_bound(abc, abc+8, 3.2);
cout<< *a;
return 0;

*a在这两种情况下都是 4,因为如果正确插入容器中,a 指向的值将是3.2的。

如果传递的值不在容器中,lower_boundupper_bound 将返回相同的迭代器,此处就是这种情况。

lower_bound返回的迭代器定义为传递的元素可以驻留在容器中的最低位置,higher_bound返回最高位置。它们返回与数组中存在的最接近元素相关的任何内容。

为了找到最接近的元素,您知道lower_bound的取消引用结果大于或等于传递的值。在此之前的值(如果有(必须更小。您可以利用这一点来获得最接近的值。

由于数组中没有值 3.2,因此std::lower_boundstd::upper_bound 两种算法将返回相同的迭代器。

在这种情况下,您应该考虑以前的迭代器。

这是一个演示程序。

#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstdlib>
int main() 
{
    float abc[] = { 1, 3, 4, 5, 6, 7, 8, 9 };
    float value = 3.2f;
    auto it = std::lower_bound( std::begin( abc ), std::end( abc ), value );
    auto closest = it;
    if ( it == std::end( abc ) )
    {
        closest = std::prev( it );
    }
    else if ( it != std::begin( abc ) )
    {
        closest = std::min( std::prev( it ), it, 
                            [&value]( const auto &p1, const auto &p2 )
                            {
                                return abs( value - *p1 ) < abs( value - *p2 );
                            } );
    }
    std::cout << *closest << " at position " << std::distance( std::begin( abc ), closest ) << std::endl;
    return 0;
}

它的输出是

3 at position 1