容器搜索算法:lower_bound, uper_bound

来源:互联网 发布:mysql主键可以重复吗 编辑:程序博客网 时间:2024/06/06 17:35

本文主要是验证,容器搜索算法的使用:lower_bound, uper_bound
C++ STL

iterator lower_bound( const key_type &key );

iterator upper_bound( const key_type &key );

2函数作用

iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。

iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值> key的第一个元素。

3举例

例如:map中已经插入了1234的话,如果lower_bound(2)的话,返回的2,而upper_bound2)的话,返回的就是3

 

验证项目:
1.
key  > begin lower_bound, uper_bound取值
2.
  key < end   lower_bound, uper_boudn取值
3.
  key  =容器中的某值(不等于bigin,也不等于end   lower_bound, uper_boudn 取值
4.
  key不等于容器中任何一Key但是在key的返回 ower_bound, uper_boudn取值
5.
key等于 bigin key等于 end的取值
测试代码:
[cpp]
#include "stdafx.h" 
#include <map> 
#include <iostream> 
 
using namespace std; 
 
int _tmain(int argc, _TCHAR* argv[]) 

    //lower_bound
函数用法,这个函数用来返回要查找关键字的下界 
    //upper_bound
函数用法,这个函数用来返回要查找关键字的上界 
    map<int,string>mp; 
 
    mp[3]="3"; 
    mp[4]="4"; 
    mp[7]="7"; 
    mp[8]="8"; 
 
    map<int,string>::iterator iterLowerBound5,iterUperBound5; 
    map<int,string>::iterator iterLowerBound7,iterUperBound7; 
    map<int,string>::iterator iterLowerBound3,iterUperBound3; 
    map<int,string>::iterator iterLowerBound8,iterUperBound8; 
    map<int,string>::iterator iterLowerBound10,iterUperBound10; 
    map<int,string>::iterator iterLowerBound1,iterUperBound1; 
 
    iterLowerBound5 = mp.lower_bound(5); 
    iterUperBound5  = mp.upper_bound(5); 
 
    iterLowerBound7 = mp.lower_bound(7); 
    iterUperBound7  = mp.upper_bound(7); 
 
    iterLowerBound3 = mp.lower_bound(0); 
    iterUperBound3  = mp.upper_bound(0); 
 
    iterLowerBound8 = mp.lower_bound(8); 
    iterUperBound8  = mp.upper_bound(8); 
     
    iterLowerBound10 = mp.lower_bound(10); 
    iterUperBound10  = mp.upper_bound(10); 
    if(iterLowerBound10 == mp.end()) 
        cout << "iterUperBound10 = end" << endl; 
    if(iterUperBound10 == mp.end()) 
        cout << "iterUperBound10 = end" << endl; 
 
    iterLowerBound1 = mp.lower_bound(1); 
    iterUperBound1  = mp.upper_bound(1); 
    if(iterLowerBound1 == mp.end()) 
        cout << "iterUperBound1 = end" << endl; 
    if(iterUperBound1 == mp.end()) 
        cout << "iterUperBound1 = end" << endl; 
 
    if(iterLowerBound1 == mp.begin()) 
        cout << "iterUperBound1 = begin" << endl; 
    if(iterUperBound1 == mp.begin()) 
        cout << "iterUperBound1 = begin" << endl; 
 
    //iter2 = mp.upper_bound(5); 
 
    string Str = iterLowerBound5->second; 
    cout<<"lower_bound(5) = " <<Str.c_str()<<endl; 
    Str = iterUperBound5->second; 
    cout<<"upper_bound(5) = " <<Str.c_str()<<endl; 
 
    Str = iterLowerBound7->second; 
    cout<<"lower_bound(7) = " << Str.c_str()<<endl; 
    Str = iterUperBound7->second; 
    cout<<"upper_bound(7) = " << Str.c_str()<<endl; 
 
    Str = iterLowerBound3->second; 
    cout<<"lower_bound(0) = " << Str.c_str()<<endl; 
    Str = iterUperBound3->second; 
    cout<<"upper_bound(0) = " << Str.c_str()<<endl; 
 
    Str = iterLowerBound8->second; 
    cout<<"lower_bound(8) = " << Str.c_str()<<endl; 
    //Str = iterUperBound8->second; 
    if(iterUperBound8 == mp.end()) 
     cout<<"upper_bound(8) == end" << Str.c_str()<<endl; 
      
    while(1); 
    return 0; 

打印输出:
iterLowerBound10 = end

iterUperBound10 = end

iterLowerBound1 = begin

iterUperBound1 = begin

lower_bound(5) = 7

lower_bound(5) = 7

lower_bound(7) = 7

lower_bound(7) = 8

lower_bound(0) = 3

lower_bound(0) = 3

lower_bound(8) = 8

lower_bound(8) = end8
结论:
当参数 key没有在容器 key的范围内:
1.
小于容器key uper_bound lower_bound都将返回 begin.
2.
大于容器key uper_bound, lower_bound都将返回 end
当参数key在容器key范围内:
1.
参数 key ==容器key. lower_bound将返回当前keyiterator uper_bound将返回下一个元素的iterator.
2.
参数 key不等于容器key,且在范围内, lower_bound将返回比参数key大的且相邻的容器keyiterator
3
如果 Key等于 begin或等于 end,将返回beginend

 

0 0
原创粉丝点击