C++ lower_bound/upper_bound在不同容器中的使用

lower_bound和upper_bound是极其灵活的函数,以下内容仅对基础的,在算法竞赛中常见的用法进行归纳总结(均以lower_bound为例),亦可作为语法模板投入使用。其拓展用法如 用greater<type>()重载自定义匿名函数等就留给以后尽情探索。

笔者学识有限,如有疏漏错误,敬请指出。

功能概述

lower_bound(k)寻找第一个大于等于k的元素

upper_bound(k)寻找第一个大于k的元素

调用方法

1 (有序的)数组、(有序的)vector

头文件<algorithm>

时间复杂度为插入O(N)+二分查找O(logN)

函数原型
template <class ForwardIterator, class T>  ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& val);
使用示例
using namespace std;
#include <iostream>     // std::cout
#include <algorithm>    // std::lower_bound, std::upper_bound, std::sort
#include <vector>       // std::vector

int main () {
// 数组有序 可以直接操作
// !需要知道数组长度
	int myints1[] = {10,10,10,20,20,20,30,30};  
    //用指针
    int* arry_p = lower_bound(myints1, myints1 + 8, 20);	 // *arry_p = 20
    //用下标
    int arry_pos = lower_bound(myints1, myints1+8, 20) - myints1; 
    											// arry_pos = 3, myints1[arry_pos] = 20
    
// 数组无序 转成vector后可方便的排序 然后操作
    int myints2[] = {10,20,30,30,20,10,10,20};
    
    vector<int> vec(myints2, myints2+8);           // 10 20 30 30 20 10 10 20
    sort (vec.begin(), vec.end());                 // 10 10 10 20 20 20 30 30
    
    //用迭代器
    vector<int>::iterator vec_iter;
    vec_iter = lower_bound (vec.begin(), vec.end(), 20);	// *vec_iter = 20
    //用下标
    int vec_pos;
    vec_pos = lower_bound (vec.begin(), vec.end(), 20) - vec.begin();	
    											// vec_pos = 3, vec[vec_pos] = 20

    return 0;
}


2 map

头文件<map>

时间复杂度为插入(logN)+二分查找O(logN)

函数原型
iterator lower_bound (const key_type& k);
const_iterator lower_bound (const key_type& k) const;
使用示例
using namespace std;
#include <iostream>     // std::cout
#include <map>          // map::lower_bound/upper_bound

int main () {
    map<int, int> mp; 
  
    // insert elements in random order 
    mp.insert({ 12, 30 }); 
    mp.insert({ 11, 10 }); 
    mp.insert({ 15, 50 }); 
    mp.insert({ 14, 40 }); 
  
	// 只能用迭代器
    map<int,int>::iterator mp_it1;
    mp_it1 = mp.lower_bound(11);
    auto mp_it2 = mp.lower_bound(11); // 更方便的写法 *

    // 两种引用方法
    cout << (*mp_it1).first << " " << (*mp_it1).second << endl; 
    cout << mp_it1->first << " " << mp_it1->second << endl; 

    return 0;
}
使用场景
  • 查找左右两边界,对区间进行删除,计算等操作
  • To be continued…

3 set

头文件<set>

To be continued…

参考文章:

cplusplus.com/reference/algorithm/lower_bound/

如何让Dev-C++支持auto关键字_devc++中auto不能用吗-CSDN博客

C++ Set upper_bound()用法及代码示例 - 纯净天空 (vimsky.com)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RIDL_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值