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;
}
- 有关auto关键字:C++11新增功能,而在Dev-C++中默认C98,所以直接使用会报错。具体解决方案请参考如何让Dev-C++支持auto关键字_devc++中auto不能用吗-CSDN博客
使用场景
- 查找左右两边界,对区间进行删除,计算等操作
- To be continued…
3 set
头文件<set>
To be continued…
参考文章:
cplusplus.com/reference/algorithm/lower_bound/