泛型算法:二分查找算法lower_bound()、upper_bound()、equal_range()、binary_search()

1、lower_bound()

lower_bound() 函数返回一个迭代器,指向第一个不小于(大于等于给定值的元素位置。如果容器中不存在不小于给定值的元素,则返回指向容器末尾的迭代器。

lower_bound()有两个版本。

  • lower_bound(起始地址,结束地址,要查找的数值) 获取第一个大于等于参数三的值。
    QList<int> list;
    for(int i = 0;i < 20;++i)
    {
        list << QRandomGenerator::global()->bounded(100);
    }
    std::sort(list.begin(),list.end());
    qDebug()<<list;

    auto reslut = std::lower_bound(list.begin(),list.end(),44);
    if(reslut != list.end())
    {
        qDebug()<<*reslut;
    }

从中间开始二分查找,这里返回第一个大于等于44的数字。 

  • lower_bound(迭代器1,迭代器2,元素,自定义小于函数)。
struct ceshi
{
    int frist = 0;
    int second = 0;
};
    QList<ceshi> list;
    for(int i = 0;i < 10;++i)
    {
        ceshi c;
        c.frist = QRandomGenerator::global()->bounded(100);
        c.second = QRandomGenerator::global()->bounded(100);
        list << c;
    }
    std::sort(list.begin(),list.end(),[](const ceshi& c1, const ceshi& c2)
    {
        return c1.second < c2.second;
    });

    std::for_each(list.begin(),list.end(),[](const ceshi & c)
    {
        qDebug()<<c.frist<<c.second;
    });

    ceshi c;
    c.frist = 33;
    c.second = 23;

    QList<ceshi>::iterator reslut = std::lower_bound(list.begin(),list.end(),c,[](const ceshi& c1, const ceshi& c2)
    {
        return c1.second < c2.second;
    });

    if(reslut != list.end())
    {
        ceshi c = *reslut;
        qDebug()<<c.frist<<c.second;
    }

这里自定义小于规则:比较结构体的second,second小的就认为元素较小。

2、upper_bound() 

类似lower_bound(),upper_bound() 函数返回一个迭代器,指向第一个大于给定值的元素位置。如果容器中不存在大于给定值的元素,则返回指向容器末尾的迭代器。

3、equal_range()

equal_range()查找范围内等于目标值的元素。返回一个pair。

当查找成功时:

  1. 第 1 个迭代器指向的是 [first, last) 区域中第一个等于 val 的元素;
  2. 第 2 个迭代器指向的是 [first, last) 区域中第一个大于 val 的元素。
    QList<int> list;
    for(int i = 0;i < 20;++i)
    {
        list << QRandomGenerator::global()->bounded(100);
    }
    std::sort(list.begin(),list.end());
    qDebug()<<list;

    auto reslut = std::equal_range(list.begin(),list.end(),44);
    qDebug()<<*reslut.first<<*reslut.second;

 反之如果查找失败,则这 2 个迭代器要么都指向大于 val 的第一个元素(如果有),要么都和 迭代器2指向相同。

4、binary_search()

序列中是否有等于目标元素的元素

    QList<int> list;
    for(int i = 0;i < 20;++i)
    {
        list << QRandomGenerator::global()->bounded(100);
    }
    std::sort(list.begin(),list.end());
    qDebug()<<list;

    auto reslut = std::binary_search(list.begin(),list.end(),44);
    qDebug()<<reslut;

这里如果指定一个比较函数,那么函数仍然是二元谓词函数:

    auto reslut = std::binary_search(list.begin(),list.end(),44,[](const int & c1, const int& c2)
    {
        return c1 < c2;
    });

 这里比较是否相等是判断:如果c1 < c2不成立且c2 < c1不成立则c1和c2相等。而不是c1 == c2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值