【map的lower_bound up, 与erase】stl
来源:互联网 发布:98年击沉印尼军舰 知乎 编辑:程序博客网 时间:2024/06/07 10:28
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!大家可以看到一个很有意思的性质:upper_bound - lower_bound = 数组中 value 的个数函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置举例如下:一个数组number序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,111.pos为要插入的位置的下标则记得-数组!!!!!!!!!!!!!!!!pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number数组的下标为0的位置。pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number数组的下标为1的位置(即10所在的位置)。pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素)。所以,要记住:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!~STL中关于二分查找的函数有三个lower_bound 、upper_bound 、binary_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
- 【map的lower_bound up, 与erase】stl
- 正确运用stl map的erase方法
- 正确运用stl map的erase方法
- 正确运用stl map的erase方法
- 正确使用stl map的erase方法
- 正确使用stl map的erase方法
- 正确使用stl map的erase方法
- 正确使用stl map的erase方法
- 正确运用stl map的erase方法
- STL中map的erase操作
- 正确使用stl map的erase方法
- 正确使用stl map的erase方法
- 正确使用stl map的erase方法
- 正确运用stl map的erase方法
- 正确使用stl map的erase方法
- STL lower_bound与upper_bound
- STL set,map , priority_queue 及 lower_bound 的排序比较函数
- c++之map与vector的erase
- Google 开源的 Android 排版库:FlexboxLayout
- C#调用Oracle带输出数据集的存储过程
- 在使用VS2010时所遇见的问题总结
- JAVA Vector & ArrayList 的主要区别
- spark-submit 运行参数问题记录
- 【map的lower_bound up, 与erase】stl
- 阿里云文件迁移工具使用小结
- 周鸿祎:真想不通是张小龙这样的人做出了微信!
- 【bzoj4152】【AMPPZ2014】The Captain
- LeetCode OJ (2)
- 什么是交叉编译,为什么要使用交叉编译?
- srs代码学习(7)--消息接收过程
- java 对象 和 json 之间互转 例子
- POJ 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS