C++ uppper_bound 使用
map 的 key,默认按照 从小到大 排序,此时可以省略 比较函数;
upper_bound(4),不包含4
lower_bound(4),包含4
#include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() { map<int, string> mapA; //默认从小到大排序(升序) for(int i=0;i<10;++i) { string str; str ="henry" + std::to_string(10-i); mapA[i]=str; cout <<"key:"<<i<<",val:"<<mapA[i]<<endl; } auto upIt = mapA.upper_bound(4);//从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。 auto lowIt = mapA.lower_bound(4); cout <<"---------out put upper_bound(4)---for(auto it = mapA.begin(); it!=upIt; ++it) "<<endl; for(auto it = mapA.begin(); it!=upIt; ++it) { cout <<"key:"<< it->first<<",val:"<<it->second<<endl;// 0,1,2,3,4 } cout <<endl; cout <<"---------out put upper_bound(4)---for(auto it=upIt; it != mapA.end(); ++it)"<<endl; // 从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。 // upIt ~ mapA.end(), 5,6,7,8,9 for(auto it=upIt; it != mapA.end(); ++it) { cout <<"key:"<< it->first<<",val:"<<it->second<<endl;// 0,1,2,3,4 } cout <<endl; cout <<"---------out put lower_bound(4)---for(auto it = lowIt; it!=mapA.end(); ++it)"<<endl; // 从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。 // lowIt ~ mapA.end(), 4,5,6,7,8,9 for(auto it = lowIt; it!=mapA.end(); ++it) { cout <<"key:"<< it->first<<",val:"<<it->second<<endl;//4,5,6,7,8,9 } cout <<endl; cout <<"---------out put lower_bound(4)---for(auto it!=mapA.begin(); it != lowIt; ++it)"<<endl; for(auto it=mapA.begin(); it != lowIt; ++it) { cout <<"key:"<< it->first<<",val:"<<it->second<<endl;//4,5,6,7,8,9 } cout <<endl; cout <<"-----finished -----"<<endl; return 0; }
#include <iostream> #include <vector> #include <map> #include <algorithm> #include <vector> using namespace std; int main() { vector<int> vec={1,3,5,7,7,7,8,8,9,10}; auto upIt = upper_bound(vec.begin(), vec.end(),7); auto lowIt = lower_bound(vec.begin(), vec.end(),7); cout <<"-----out put upper_bound -- for(auto it=vec.begin(); it!=upIt; ++it)"<<endl; for(auto it=vec.begin(); it!=upIt; ++it) { cout<<*it<<","; // 1,3,5,7,7,7, } cout <<endl; cout <<"-----out put upper_bound -- for(auto it=upIt; it!=vec.end(); ++it)"<<endl; // 从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。 // upIt ~ vec.end(), 8,8,9,10, for(auto it=upIt; it!=vec.end(); ++it) { cout<<*it<<","; // 8,8,9,10, } cout <<endl; cout <<"-----out put upper_bound -- for(auto it=vec.begin(); it!=lowIt; ++it)"<<endl; for(auto it=vec.begin(); it!=lowIt; ++it) { cout<<*it<<","; // 1,3,5, } cout <<endl; cout <<"-----out put upper_bound -- for(auto it=lowIt; it!=vec.end(); ++it)"<<endl; // 从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。 // lowIt ~ vec.end(), 7,7,7,8,8,9,10 for(auto it=lowIt; it!=vec.end(); ++it) { cout<<*it<<","; // 7,7,7,8,8,9,10 } cout <<endl; cout <<"-----finished -----"<<endl; return 0; } // g++ testFun1.cpp --std=c++11 -lpthread
#include <iostream> #include <vector> #include <map> #include <algorithm> #include <vector> using namespace std; bool cmp321(int A, int B) { return A>B; } bool cmp123(int A, int B) { return A<B; } int main() { vector<int> vec={10,9,8,8,7,7,7,5,3,1};//从大到小排序 auto upIt = upper_bound(vec.begin(), vec.end(),7, cmp321);//从大到小排序,需要添加比较函数 auto lowIt = lower_bound(vec.begin(), vec.end(),7, cmp321);//从大到小排序,需要添加比较函数 cout <<"-----out put upper_bound -- for(auto it=vec.begin(); it!=upIt; ++it)"<<endl; for(auto it=vec.begin(); it!=upIt; ++it) { cout<<*it<<","; //10,9,8,8,7,7,7, } cout <<endl; cout <<"-----out put upper_bound -- for(auto it=upIt; it!=vec.end(); ++it)"<<endl; // 对于降序或不上升序列,填cmp函数: // upper_bound函数返回指向小于k的第一个元素的指针(迭代器),找不到就返回填入的区间左端点,也就是返回指向区间初始元素的指针(迭代器) // upIt ~ vec.end(), 5,3,1, for(auto it=upIt; it!=vec.end(); ++it) { cout<<*it<<","; //5,3,1, } cout <<endl; cout <<"-----out put upper_bound -- for(auto it=vec.begin(); it!=lowIt; ++it)"<<endl; for(auto it=vec.begin(); it!=lowIt; ++it) { cout<<*it<<","; // 10,9,8,8, } cout <<endl; cout <<"-----out put upper_bound -- for(auto it=lowIt; it!=vec.end(); ++it)"<<endl; // 对于降序或不上升序列,填cmp函数: // lower_bound函数返回指向小于等于k的第一个元素的指针(迭代器),找不到就返回填入的区间左端点,也就是返回指向区间初始元素的指针(迭代器)。 // lowIt ~ vec.end(), 7,7,7,5,3,1, for(auto it=lowIt; it!=vec.end(); ++it) { cout<<*it<<","; //7,7,7,5,3,1, } cout <<endl; cout <<"-----finished -----"<<endl; return 0; } // g++ testFun1.cpp --std=c++11
总结:
对于升序或不下降序列,不填cmp函数:
upper_bound函数返回指向大于k的第一个元素的指针(迭代器),找不到就返回填入的区间右端点,也就是返回指向 | 区间末尾元素的后一个元素 | 的指针(迭代器)。
lower_bound函数返回指向大于等于k的第一个元素的指针(迭代器),找不到就返回填入的区间右端点,也就是返回指向 | 区间末尾元素的后一个元素 | 的指针(迭代器)。
一般来说,都是从小到大排序
upper_bound(4),不包含4
lower_bound(4),包含4
对于降序或不上升序列,填cmp函数:(必须带上cmp函数)
upper_bound函数返回指向小于k的第一个元素的指针(迭代器),找不到就返回填入的区间左端点,也就是返回指向区间初始元素的指针(迭代器)。
lower_bound函数返回指向小于等于k的第一个元素的指针(迭代器),找不到就返回填入的区间左端点,也就是返回指向区间初始元素的指针(迭代器)。