STL二分查找
在STL里面有binary_search,lower_bound , upper_bound 三种二分查询的方法,复杂度都为log(n);在一些查找题目里面,作用很大;
前提
三种查找都是基于要查找的容器是已经排好序的情况下( 必须为从小到大排),这个容器可以是数组,结构体,map,set,vector;
返回值
比较头疼的是三种查找的返回值
- binary_search的返回值是false或true;当找到元素时返回true,没有找到返回false;
- lower_bound的返回值是跟查找元素一样大,或者比查找元素大的第一个元素的下标(等于优先,如果没有等于就是第一个大于);这里的下标在每个容器里都是不一样的,在数组里面是数组下标,在STL容器中是迭代器指针;所以要知道准确位置还要减去数组原来的下标,或者迭代器的begin()指针(这里有误,如果是set容器,不能加减);
- upper_bound跟lower_bound不同的是返回值是比查找元素大的第一个元素的下标,没有等于;其他的相同;
运用
一般是用binary_search查找容器中是否有这个元素;
而lower_bound和upper_bound除了这个作用之外还有求要查找元素的具体位置的作用;
一个数组a序列:1,2,3,4,5,6,7,8.设要查找数字0,6,111. pos为查找元素位置的下标
pos = lower_bound( a, a + 8, 0) - a,pos = 0.即a数组的下标为0的位置。(也就是没有找到)
pos = lower_bound( a, a + 8, 6) - a, pos = 5,即a数组的下标为5的位置(即6所在的位置)。
pos = lower_bound( a, a + 8, 111) - a, pos = 8,即number数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素,相当于没有找到)。
完