關於std::lower_bound和st::upper_bound

std::lower_bound和st::upper_bound詳細使用說明請看代碼

// 
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
//lower_bound的作用是返回第一個不滿足比較操作的迭代器,如果序列是升序排列,則比較操作符只能是<或<=;如果是降序排列,比較操作符只能是>或>=
//
//upper_bound的作用是返回第一個滿足比較操作的迭代器,如果序列是升序排列,則比較操作符只能是>或>=;如果是降序排列,比較操作符只能是<或<=
//注意:上述的比較操作符左側都是迭代器,右側都是某個值,但lower_bound的比較函數的第一個參數是迭代器,第二個參數是某值;而upper_bound正好相反。
//詳細情況請參考代碼
//有問題可留言或加qq羣:1032082534
void printvector(std::vector<int>& v){
    for(auto it=v.begin();it!=v.end();++it){
        std::cout<<*it<<" ";
    }
    std::cout<<std::endl;
}
struct lesseq {
				bool operator()( int iterator,  int val) {
					return iterator <= val;
				}
			};

struct less {
				bool operator()( int iterator,  int val) {
					return iterator < val;
				}
			};
struct greatereq {
				bool operator()( int iterator,  int val) {
					return iterator >= val;
				}
			};

struct greater {
				bool operator()( int iterator,  int val) {
					return iterator > val;
				}
			};

struct lesseq2 {
				bool operator()( int val,  int iterator) {
					return iterator<=val;
				}
			};
struct less2 {
				bool operator()( int val,  int iterator) {
					return iterator<val;
				}
			};
struct greatereq2 {
				bool operator()( int val,  int iterator) {
					return iterator>=val;
				}
			};
struct greater2 {
				bool operator()( int val,  int iterator) {
					return iterator>val;
				}
			};

int main()
{
    std::vector<int> aa{1,1,1,2,2,2,2,2,3,6};
    printvector(aa);
    auto it=std::lower_bound(aa.begin(),aa.end(),2,less());
    
    std::cout <<"第一個不滿足條件(條件是 <2)的元素索引:"<<it-aa.begin() << std::endl;
    
    it=std::lower_bound(aa.begin(),aa.end(),2,lesseq());    
    std::cout <<"第一個不滿足條件(條件是<=2)的元素索引"<<it-aa.begin() << std::endl;
    
    it=std::upper_bound(aa.begin(),aa.end(),2,greatereq2());    
    std::cout <<"第一個滿足條件(條件是>=2)的元素索引"<<it-aa.begin() << std::endl;
    
    it=std::upper_bound(aa.begin(),aa.end(),2,greater2());    
    std::cout <<"第一個滿足條件(條件是>2)的元素索引"<<it-aa.begin() << std::endl;
    
    
    std::reverse(aa.begin(),aa.end());
    printvector(aa);
    auto it2=std::lower_bound(aa.begin(),aa.end(),2,greatereq());    
    std::cout <<"第一個不滿足條件(條件是>=2)的元素索引"<<it2-aa.begin() << std::endl;
    it2=std::lower_bound(aa.begin(),aa.end(),2,greater());    
    std::cout <<"第一個不滿足條件(條件是>2)的元素索引"<<it2-aa.begin() << std::endl;
    
    it=std::upper_bound(aa.begin(),aa.end(),2,lesseq2());    
    std::cout <<"第一個滿足條件(條件是<=2)的元素索引"<<it-aa.begin() << std::endl;
    
    it=std::upper_bound(aa.begin(),aa.end(),2,less2());    
    std::cout <<"第一個滿足條件(條件是<2)的元素索引"<<it-aa.begin() << std::endl;
}

// GCC reference:
//   https://gcc.gnu.org/

// C++ language references:
//   https://cppreference.com/
//   https://isocpp.org/
//   http://www.open-std.org/jtc1/sc22/wg21/

// Boost libraries references:
//   https://www.boost.org/doc/


運行結果:

1 1 1 2 2 2 2 2 3 6
第一個不滿足條件(條件是 <2)的元素索引:3
第一個不滿足條件(條件是<=2)的元素索引8
第一個滿足條件(條件是>=2)的元素索引3
第一個滿足條件(條件是>2)的元素索引8
6 3 2 2 2 2 2 1 1 1
第一個不滿足條件(條件是>=2)的元素索引7
第一個不滿足條件(條件是>2)的元素索引2
第一個滿足條件(條件是<=2)的元素索引2
第一個滿足條件(條件是<2)的元素索引7

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章