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 个迭代器指向的是 [first, last) 区域中第一个等于 val 的元素;
- 第 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。