C++ uppper_bound 使用

map 的 key,默认按照 从小到大 排序,此时可以省略 比较函数; 

upper_bound(4),不包含4

lower_bound(4),包含4

 

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

int main()
{
    map<int, string>  mapA;   //默认从小到大排序(升序)

    for(int i=0;i<10;++i)
    {
        string str;
        str ="henry" + std::to_string(10-i);
        mapA[i]=str;
        cout <<"key:"<<i<<",val:"<<mapA[i]<<endl;
    }

 
    auto upIt = mapA.upper_bound(4);//从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。
    auto lowIt = mapA.lower_bound(4);

    cout <<"---------out put upper_bound(4)---for(auto it = mapA.begin(); it!=upIt; ++it) "<<endl;
    for(auto it = mapA.begin(); it!=upIt; ++it)
    {
        cout <<"key:"<< it->first<<",val:"<<it->second<<endl;// 0,1,2,3,4
    }
    cout <<endl;

    cout <<"---------out put upper_bound(4)---for(auto it=upIt; it != mapA.end(); ++it)"<<endl;
    // 从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。
    // upIt ~ mapA.end(),  5,6,7,8,9
    for(auto it=upIt; it != mapA.end(); ++it)
    {
        cout <<"key:"<< it->first<<",val:"<<it->second<<endl;// 0,1,2,3,4
    }
    cout <<endl;

    

    cout <<"---------out put lower_bound(4)---for(auto it = lowIt; it!=mapA.end(); ++it)"<<endl;
    // 从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。
    // lowIt ~ mapA.end(),   4,5,6,7,8,9
    for(auto it = lowIt; it!=mapA.end(); ++it)
    {
        cout <<"key:"<< it->first<<",val:"<<it->second<<endl;//4,5,6,7,8,9
    }
    cout <<endl;

    cout <<"---------out put lower_bound(4)---for(auto it!=mapA.begin(); it != lowIt; ++it)"<<endl;
    for(auto it=mapA.begin(); it != lowIt; ++it)
    {
        cout <<"key:"<< it->first<<",val:"<<it->second<<endl;//4,5,6,7,8,9
    }
    cout <<endl;

    cout <<"-----finished -----"<<endl;
    return 0;
}

 

 

 

 

 

 

 

 

 

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec={1,3,5,7,7,7,8,8,9,10};
    auto upIt = upper_bound(vec.begin(), vec.end(),7);
    auto lowIt = lower_bound(vec.begin(), vec.end(),7);

    cout <<"-----out put upper_bound -- for(auto it=vec.begin(); it!=upIt; ++it)"<<endl;
    for(auto it=vec.begin(); it!=upIt; ++it)
    {
        cout<<*it<<",";  // 1,3,5,7,7,7,
    }
    cout <<endl;

    cout <<"-----out put upper_bound -- for(auto it=upIt; it!=vec.end(); ++it)"<<endl;
     // 从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。
    // upIt ~ vec.end(),   8,8,9,10,
    for(auto it=upIt; it!=vec.end(); ++it)
    {
        cout<<*it<<",";  // 8,8,9,10,
    }
    cout <<endl;



    cout <<"-----out put upper_bound -- for(auto it=vec.begin(); it!=lowIt; ++it)"<<endl;
    for(auto it=vec.begin(); it!=lowIt; ++it)
    {
        cout<<*it<<",";  // 1,3,5,
    }
    cout <<endl;

    cout <<"-----out put upper_bound -- for(auto it=lowIt; it!=vec.end(); ++it)"<<endl;
    // 从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。
    // lowIt ~ vec.end(),  7,7,7,8,8,9,10
    for(auto it=lowIt; it!=vec.end(); ++it)
    {
        cout<<*it<<",";  // 7,7,7,8,8,9,10
    }
    cout <<endl;


    cout <<"-----finished -----"<<endl;
    return 0;
}

//  g++ testFun1.cpp --std=c++11  -lpthread

 

 

 

 

 

 

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;

bool cmp321(int A, int B)
{
    return A>B;
}

bool cmp123(int A, int B)
{
    return A<B;
}

int main()
{
    vector<int> vec={10,9,8,8,7,7,7,5,3,1};//从大到小排序
    auto upIt = upper_bound(vec.begin(), vec.end(),7, cmp321);//从大到小排序,需要添加比较函数
    auto lowIt = lower_bound(vec.begin(), vec.end(),7, cmp321);//从大到小排序,需要添加比较函数

    cout <<"-----out put upper_bound -- for(auto it=vec.begin(); it!=upIt; ++it)"<<endl;
    for(auto it=vec.begin(); it!=upIt; ++it)
    {
        cout<<*it<<",";  //10,9,8,8,7,7,7,
    }
    cout <<endl;

    cout <<"-----out put upper_bound -- for(auto it=upIt; it!=vec.end(); ++it)"<<endl;
    // 对于降序或不上升序列,填cmp函数:
     // upper_bound函数返回指向小于k的第一个元素的指针(迭代器),找不到就返回填入的区间左端点,也就是返回指向区间初始元素的指针(迭代器)
    // upIt ~ vec.end(),  5,3,1,
    for(auto it=upIt; it!=vec.end(); ++it)
    {
        cout<<*it<<",";  //5,3,1,
    }
    cout <<endl;



    cout <<"-----out put upper_bound -- for(auto it=vec.begin(); it!=lowIt; ++it)"<<endl;
    for(auto it=vec.begin(); it!=lowIt; ++it)
    {
        cout<<*it<<",";  // 10,9,8,8,
    }
    cout <<endl;

    cout <<"-----out put upper_bound -- for(auto it=lowIt; it!=vec.end(); ++it)"<<endl;
    // 对于降序或不上升序列,填cmp函数:
    // lower_bound函数返回指向小于等于k的第一个元素的指针(迭代器),找不到就返回填入的区间左端点,也就是返回指向区间初始元素的指针(迭代器)。
    // lowIt ~ vec.end(), 7,7,7,5,3,1,
    for(auto it=lowIt; it!=vec.end(); ++it)
    {
        cout<<*it<<",";  //7,7,7,5,3,1,
    }
    cout <<endl;


    cout <<"-----finished -----"<<endl;
    return 0;
}

//  g++ testFun1.cpp --std=c++11  

 

 

 

总结:

对于升序或不下降序列,不填cmp函数:
upper_bound函数返回指向大于k的第一个元素的指针(迭代器),找不到就返回填入的区间右端点,也就是返回指向 | 区间末尾元素的后一个元素 | 的指针(迭代器)。
lower_bound函数返回指向大于等于k的第一个元素的指针(迭代器),找不到就返回填入的区间右端点,也就是返回指向 | 区间末尾元素的后一个元素 | 的指针(迭代器)。

 

一般来说,都是从小到大排序

upper_bound(4),不包含4

lower_bound(4),包含4

 


对于降序或不上升序列,填cmp函数:(必须带上cmp函数)
upper_bound函数返回指向小于k的第一个元素的指针(迭代器),找不到就返回填入的区间左端点,也就是返回指向区间初始元素的指针(迭代器)。
lower_bound函数返回指向小于等于k的第一个元素的指针(迭代器),找不到就返回填入的区间左端点,也就是返回指向区间初始元素的指针(迭代器)。

 

posted @ 2023-02-15 09:12  He_LiangLiang  阅读(257)  评论(0编辑  收藏  举报