【map的lower_bound up, 与erase】stl

来源:互联网 发布:98年击沉印尼军舰 知乎 编辑:程序博客网 时间:2024/06/07 10:28
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!大家可以看到一个很有意思的性质:upper_bound - lower_bound = 数组中 value 的个数函数lower_bound()在firstlast中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置举例如下:一个数组number序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,111.pos为要插入的位置的下标则记得-数组!!!!!!!!!!!!!!!!pos = lower_bound( number, number + 8, 3) - numberpos = 0.即number数组的下标为0的位置。pos = lower_bound( number, number + 8, 9) - numberpos = 1,即number数组的下标为1的位置(即10所在的位置)。pos = lower_bound( number, number + 8, 111) - numberpos = 8,即number数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素)。所以,要记住:函数lower_bound()在firstlast中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!~STL中关于二分查找的函数有三个lower_boundupper_boundbinary_search 。这三个函数都运用于有序区间(当然这也是运用二分查找的前提),下面记录一下这两个函数。ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于值val的位置。int upper_bound(int *array, int size, int key){    int len = size-1;    int half, middle;    while(len > 0){        half = len >> 1;        middle = first + half;        if(array[middle] > key)     //中位数大于key,在包含last的左半边序列中查找。            len = half;        else{            first = middle + 1;    //中位数小于等于key,在右半边序列中查找。            len = len - half - 1;        }    }    return first;}//这个算法中,first是最终要返回的位置int lower_bound(int *array, int size, int key){    int first = 0, middle;    int half, len;    len = size;    while(len > 0) {        half = len >> 1;        middle = first + half;        if(array[middle] < key) {                 first = middle + 1;                      len = len-half-1;       //在右边子序列中查找        }        else            len = half;            //在左边子序列(包含middle)中查找    }    return first;}还有一个 upper_bound升序排列:iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值>key的最后一个元素的后一个元素。例如:1 2 3 4lower (2)  = 2;upper (2)  = 3;
// map::lower_bound/upper_bound#include <iostream>#include <map>int main (){  std::map<char,int> mymap;  std::map<char,int>::iterator itlow,itup;  mymap['a']=20;  mymap['b']=40;  mymap['c']=60;  mymap['d']=80;  mymap['e']=100;  itlow=mymap.lower_bound ('b');  // itlow points to b  itup=mymap.upper_bound ('d');   // itup points to e (not d!)  mymap.erase(itlow,itup);        // erases [itlow,itup)  // print content:  for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)    std::cout << it->first << " => " << it->second << '\n';  return 0;}

结果:
a => 20
e => 100

lower 找 k<=的第一个数
up 找k< 的第一个数

0 0
原创粉丝点击