词条 | lower_bound |
释义 | C++ STL函数原型第一个版本: template< class ForwardIterator, class Type > ForwardIterator lower_bound( ForwardIterator first, ForwardIterator last, const Type &value ); 第二个版本: template< class ForwardIterator, class Type, class Compare > ForwardIterator lower_bound( ForwardIterator first, ForwardIterator last, const Type &value, Compare comp ); 函数介绍lower_bound()返回一个 iterator 它指向在[first,last)标记的有序序列中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个大于等于value 的值。 例如,有如下序列: ia[]={12,15,17,19,20,22,23,26,29,35,40,51}; 用值21调用lower_bound(),返回一个指向22的iterator。用值22调用lower_bound(),也返回一个指向22的iterator。第一个版本使用底层的 < (小于)操作符,第二个版本根据comp进行排序和比较。 注意事项调用lower_bound之前必须确定序列为有序序列,否则调用出错。第一个版本排序根据底层的 <(小于)操作符,第二个版本根据comp进行排序。 举例第一个版本vector<int> nums; nums.push_back( -242 ); nums.push_back( -1 ); nums.push_back( 0 ); nums.push_back( 5 ); nums.push_back( 8 ); nums.push_back( 8 ); nums.push_back( 11 ); cout << "Before nums is: "; for( unsigned int i = 0; i < nums.size(); i++ ) { cout << nums[i] << " "; } cout << endl; vector<int>::iterator result; int new_val = 7; result = lower_bound( nums.begin(), nums.end(), new_val ); nums.insert( result, new_val ); cout << "After, nums is: "; for( unsigned int i = 0; i < nums.size(); i++ ) { cout << nums[i] << " "; } cout << endl; 输出: Before nums is: -242 -1 0 5 8 8 11 After, nums is: -242 -1 0 5 7 8 8 11 第二个版本#include <iostream> #include <vector> #include <algorithm> using namespace std; class person { private: int age; //年龄 double height; //身高 string name; //姓名 public: person():age( 0 ),height( 0.0 ) { } person(const int age_, const double height_, const string & name_) :age(age_), height(height_), name(name_) { } int key1() const { return age; } double key2() const { return height; } const string & key3() const { return name; } }; struct compareByTwoKey { template<class T1, class T2> int operator()(const T1 &t1, const T2 &t2) { if (t1.key1() < t2.key1()) return true; else if(t1.key1() == t2.key1()) { if(t1.key2() < t2.key2()) return true; else return false; } else return false; } }; void init_data(vector<person> &v) { v.push_back(person(12, 96.8, "你好")); v.push_back(person(12, 86.9, "你好")); v.push_back(person(13, 76.8, "你好")); v.push_back(person(13, 77.8, "你好")); v.push_back(person(10, 70.8, "你好")); v.push_back(person(15, 79.8, "你好")); v.push_back(person(18, 176.8,"你好")); v.push_back(person(2 , 6.8, "你好")); v.push_back(person(12, 55.8, "你好")); v.push_back(person(12, 97.8, "你好")); sort(v.begin(), v.end(), compareByTwoKey()); // 一定要加上排序,并且排序函数跟lower_bound一致 } int main() { vector<person> v; init_data(v); person val(12,90.0,"hello"); vector<person>::iterator iter; iter = lower_bound(v.begin(), v.end(), val, compareByTwoKey());//跟sort函数一致 system("pause"); } iter指向person(12, 97.8, "你好")这一条记录。读者也可以更改compareByTwoKey为compareByThreeKey。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。