有关lower_bound()函数的使用

lower_bound()函数需要加载头文件#include<algorithm>,其基本用途是查找有序区间中第一个大于或等于某给定值的元素的位置,其中排序规则可以通过二元关系来表示。

函数原型:template<class ForwardIterator, class Type>
   ForwardIterator lower_bound(
      ForwardIterator _First,
      ForwardIterator _Last,
      const Type& _Val
   );
template<class ForwardIterator, class Type, class BinaryPredicate>
   ForwardIterator lower_bound(
      ForwardIterator _First,
      ForwardIterator _Last,
      const Type& _Val,
      BinaryPredicate _Comp
   );

传入参数说明:
_First 要查找区间的起始位置
_Last 要查找区间的结束位置
_Val 给定用来查找的值
_Comp 自定义的表示小于关系的函数对象,根据某个元素是否满足小于关系而返回true或者false

举例说明:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> v;
int main()
{
    for (int i = 1; i < 4; i++)
        v.push_back(2 * i);//注意此时v中的元素本身就是有序的
    vector<int>::iterator it = lower_bound(v.begin(), v.end(), 3);
    cout << *it << endl;
    return 0;
}

  

上面的例子是针对容器的,注意返回的是距离元素3最近的指针it,输出的是*it结果为元素4,假如我想得到位置而非具体的元素应该怎么办呢?这里有一个指针偏移的技巧,只需要减去起始位置的指针即可,代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> v;
int main()
{
    for (int i = 1; i < 4; i++)
        v.push_back(2 * i);//注意此时v中的元素本身就是有序的
    //vector<int>::iterator it = lower_bound(v.begin(), v.end(), 3);
    int pos = lower_bound(v.begin(), v.end(), 3)-v.begin();
    cout << pos<< endl;
    return 0;
}
 这时候返回pos就是所查找元素的位置,下标,这里查找到的元素应该是4在容器中的下标是1,所以输出pos的结果就是1.对容器适用,对数组同样适用:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a[4] = { 2, 4, 6, 8 }; //注意此时a中的元素本身就是有序的
    int * it = lower_bound(a,a+4,3);
    cout << *it<< endl;
    return 0;
}  
返回位置只需要减掉数组的起始位置即可:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a[4] = { 2, 4, 6, 8 }; //注意此时a中的元素本身就是有序的
    //int * it = lower_bound(a,a+4,3);
    int pos = lower_bound(a, a + 4, 3) - a;//a表示数组的起始位置
    cout <<pos<< endl;
    return 0;
}  

结果和容器的时候是一样的。

对于4个参数的情形,最后一个参数的自己定义的表示大小关系函数的对象,常用的逆序可以加载头文件#include<functional>,里边有一个greater<int>()函数即可对逆序求最近位置。假如说像上边一样元素为2 4 6 8,逆序则是8 6 4 2,那么求距离3最近表示的是与3最近的小于等于3的元素,输出结果则是元素2了,代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
vector<int> v;
int main()
{
    for (int i = 4; i >0; i--)
    v.push_back(2 * i);//注意此时v中的元素本身就是有序的
    vector<int>::iterator it = lower_bound(v.begin(), v.end(), 3,greater<int>());
    cout << *it << endl;
    return 0;
}   
说明,要查找的有序序列必须是合法的,已经被排序的序列。
时间: 2024-11-09 00:09:12

有关lower_bound()函数的使用的相关文章

C++中lower_bound函数和upper_bound函数

STL中关于二分查找的函数有三个lower_bound .upper_bound .binary_search .这三个函数都运用于有序区间(当然这也是运用二分查找的前提),下面记录一下这两个函数. ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置. ForwardIter upper_bound(ForwardIt

lower_bound()函数使用

lower_bound()函数需要加头文件#include<algorithm>,其基本用途是查找(返回)有序区间中第一个大于或等于给定值的元素的位置,其中排序规则可以通过二元关系来表示. 基本用法lower_bound(a,a+n,x);其中a为数组或容器名,n为数组容量,x为要查找值.注意使用前数组必须有序才能达到描述效果. 举例:a[]={ 2,4,5,8 }:那么lower_bound(a,a+4,3)返回结果为a[1](=4)的地址.若想直接得到下标,那么减去数组名a即可.即int

lower_bound() 函数使用详解

简介 lower_bound()函数是用来求一个容器中,第一个大于等于所要查找的元素的地址,具体的原理是二分查找,因此它只能用于非降序序列. 他有三个参数,第一个参数是容器的初始地址,第二个参数是容器的末尾位置,第三个参数是所要查找的元素值. 返回值是第一个大于等于所要查找的元素的地址. 具体使用 vector<int> v; v.push_back(1), v.push_back(2), v.push_back(3); //打印 2 的位置 cout << lower_bound

STL upper_bound(),lower_bound()函数的学习+自己的实现

STL里,这两个函数用于在有序的数组里找某个元素的位置,用法简单提一下upper_bound(begin,end,key),start是查找的起点,end是终点,key是关键值,lower_bound()用法一样,upper_bound()函数,返回第一个大于要找的值得位置(或者理解是这个元素的下一个位置),而Lower_bound是小于等于关键字的位置(或者理解为关键字第一次出现 的位置), #include<bits/stdc++.h> using namespace std; const

Maximum Value(unique函数,lower_bound()函数,upper_bound()函数的使用)

传送门 在看大佬的代码时候遇到了unique函数以及二分查找的lower_bound和upper_bound函数,所以写这篇文章来记录以备复习. unique函数 在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序. STL中关于二分查找的函数有三个lower_

lower_bound函数与upper_bound函数

头文件 : algorithm vector<int>a a中的元素必须升序,用的是二分 lower_bound(a.begin(),a.end(),k) 返回a容器中,最右边的小于等于k的地址,取值范围是a.begin()到a.end(); upper_noubd(a.begin(),a.end(),k) 返回a容器中,最左边的大于k的地址,取值范围是a.begin()到a.end() 原文地址:https://www.cnblogs.com/carcar/p/9142190.html

HDU 4288 Coder(模拟) 附:upper_bound与lower_bound的比较

HDU 4288 题意:太长..点进去自己看吧 思路: 一道模拟题,但直接模拟会卡TLE,所以进行些许优化,将复杂度/5. 简而言之就是用一个有序数组来模拟set. 优化是利用lower_bound函数,这里简介下lower_bound 与 upper_bound 的区别: 摘自:http://blog.csdn.net/weiguang_123/article/details/7987823 lower_bound返回[First,last)中,可以插入value的第一个位置,使得插入后仍旧满

STL 二分查找三兄弟(lower_bound(),upper_bound(),binary_search())

一:起因 (1)STL中关于二分查找的函数有三个:lower_bound .upper_bound .binary_search  -- 这三个函数都运用于有序区间(当然这也是运用二分查找 的前提),下面记录一下这两个函数: (2)ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置: (3)ForwardIter up

STL中的二分查找———lower_bound,upper_bound,binary_search

关于STL中的排序和检索,排序一般用sort函数即可,今天来整理一下检索中常用的函数——lower_bound , upper_bound 和 binary_search . STL中关于二分查找的函数有三个lower_bound .upper_bound .binary_search .这三个函数都运用于有序区间(当然这也是运用二分查找的前提). Tips:1.在检索前,应该用sort函数对数组进行从小到大排序.     2.使用以上函数时必须包含头文件:#include < algorith