1. 程式人生 > >STL中二分查詢函式

STL中二分查詢函式

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int a[12] = {1,6,31,66,67,68,69,70,71,73,76,79};
    int c[12] = {79,76,73,71,70,69,68,67,66,31,6,1};
    vector<int> b;
    b.push_back(1);
    b.push_back(6);
    b.push_back(31);
    b.push_back(66);
    b.push_back(67);
    b.push_back(68);
    b.push_back(69);
    b.push_back(70);
    b.push_back(71);
    b.push_back(73);
    b.push_back(76);
    b.push_back(79);
    int n;

binary_search(b.begin(),b.end(),n)//返回得是bool值,也適用於陣列,用於判斷有沒有找到

if(binary_search(a,a+12,n))printf("find %d\n",n);
        else printf("%d is not in array\n");
        if(binary_search(b.begin(),b.end(),n))printf("find %d\n",n);
        else printf("%d is not in array\n",n);*/
        >>>
        66
        find 66
        find 66
        99
        6422256 is not in array
        99 is not in array
        

lower_bound(b.begin(),b.end(),n);//返回得是迭代器,也適用於陣列(用對應型別得指標接著就好),用於查詢第一個不小於n得值得位置(p-1就是第一個比n小的索引了)

int *p;
        vector<int>::iterator it;
        p = lower_bound(a,a+12,n);
        if(p != a + 12)
        {
                    printf("The first num which is bigger(or equal) than %d is %d,index is : %d\n",n,*p,(p - a));
        }
        else printf("Not found!\n");

        it = lower_bound(b.begin(),b.end(),n);
        if(it != b.end())
        {
        printf("The first num which is bigger(or equal) than %d is %d,index is : %d\n",n,*it,distance(b.begin(),it));
        }
        else printf("Not found!\n");
        >>>
        6
            The first num which is bigger(or equal) than 6 is 6,index is : 1
            The first num which is bigger(or equal) than 6 is 6,index is : 1
            1
            The first num which is bigger(or equal) than 1 is 1,index is : 0
            The first num which is bigger(or equal) than 1 is 1,index is : 0
            0
            The first num which is bigger(or equal) than 0 is 1,index is : 0
            The first num which is bigger(or equal) than 0 is 1,index is : 0
            99
            Not found!
            Not found!
        

upper_bound(b.begin(),b.end(),n);//返回得是迭代器,也適用於陣列(用對應型別得指標接著就好),用於查詢第大於n得值得位置

       int *p;
        vector<int>::iterator it;
        p = upper_bound(a,a+12,n);
        if(p != a+12)
        {
            printf("The first num which is bigger than %d is %d,index is : %d\n",n,*p,(p - a));
        }
        else printf("Not found!\n");

        it = upper_bound(b.begin(),b.end(),n);
        if(it != b.end())
        {
            printf("The first num which is bigger than %d is %d,index is : %d\n",n,*it,distance(b.begin(),it));
        }
        else printf("Not found!\n");*/
        >>>
        6
    The first num which is bigger than 6 is 31,index is : 2
    The first num which is bigger than 6 is 31,index is : 2
    78
    The first num which is bigger than 78 is 79,index is : 11
    The first num which is bigger than 78 is 79,index is : 11
    79
    Not found!
    Not found!
      

對於lower_bound & upper_bound()還有一個第四個引數greater<type>(),他會把不小於變為不大於得查詢,把大於變為小於得查詢,但是相反,他要求得順序不是遞增,而是遞減!!!

int *p = lower_bound(c,c+12,n,greater<int>());//傳入第四個引數,查詢第一個小於等於n得值
    if(p != c+12)
    {
        printf("The first num which is smaller(or equal) than %d is %d,index is : %d\n",n,*p,(p - c));
    }
    else printf("Not found!\n");
    >>>
    6
    The first num which is smaller(or equal) than 6 is 6,index is : 10
    5
    The first num which is smaller(or equal) than 5 is 1,index is : 11
    0
    Not found!
    


忘了提一下distence函式他是用於迭代器得用於計算他們之間的距離~~~(注意好傳值的先後順序)

相關推薦

STL二分查詢函式

#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int a[12] = {1,6,31,66

對標準庫stdlib.h二分查詢的理解

前幾天面試的時候遇到了這個問題 ,標準庫下提供的二分查詢改錯,當時沒有改出來,寫得不好,回來查了下,這個函式的原型是: /* bsearch() and qsort() are declared both here, in <stdlib.h>, and in * non-AN

折半查詢演算法及二分查詢函式及猜數字遊戲實現

折半查詢演算法 #include<stdio.h> int main() {     int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };     int left = 0;     int right = siz

c++STL的next_permutation函式基本用法

對於next_permutation函式是針對於排列組合問題的庫函式,它的排序方式是按照字典的方式排列的·: 如以下程式碼對於next_permutation函式的初步解釋: #include<cstdio> #include<cstring> #

二分查詢函式彙總

問題:A心裡想一個1-1000之間的數,B來猜,可以問問題,A只能回答是或否。怎麼猜才能問的問題次數最少? 思路:是1嗎?是2嗎?…是999嗎? 平均要問500次 大於500嗎?大於750嗎?大於625嗎? …每次縮小猜測範圍到上次的一半 只需要 10次 二分

STL的sort函式實現原理

STL的sort()演算法,資料量大時採用Quick Sort,分段遞迴排序。一旦分段後的資料量小於某個閾值,為避免Quick Sort的遞迴呼叫帶來過大的額外開銷,就改用Insertion Sort(插入排序)。如果遞迴層次過深,還會改用Heap Sort。 STL中的sort並非只是

C++STL全排列函式next_permutation的使用

   next_permutation函式     組合數學中經常用到排列,這裡介紹一個計算序列全排列的函式:next_permutation(start,end),和prev_permutation(start,end)。這兩個函式作用是一樣的,區別就在於前者求的是當前

python二分查詢

二分查詢也稱折半查詢,它的效率較高。但是二分查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。 寫二分查詢時有兩個方法,一個是用遞迴,一個不用遞迴。 用遞迴的方法如下 #coding:utf-8 def binary_search(alist,item): ""

Linux核心中的bsearch二分查詢函式

/* * bsearch - binary search an array of elements * @key: pointer to item being searched for * @base

C++string查詢函式find與find_first_of函式的區別

string (1) size_t find_first_of (const string& str, size_t pos = 0) const noexcept; c-string (2) size_t find_first_of (co

二分查詢函式binary_search

{   int position;   T  data;   int bottom =0, top = size -1;   while (bottom < top) ...{      int mid = (bottom + top) /2;      data = arr[mid];      if

C++二分查詢(遞迴,非遞迴)

二分查詢:二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。 二分查詢要求: 1.必須採用順序儲存結構 2.必須按關鍵字大小有序排列。

mysql時間查詢函式(包括時間戳)

這些函式都是MySQL自帶的,可以直接使用在PHP寫的MySQL查詢語句中哦 1-CURDATE()或CURRENT_DATE()和CURTIME()或CURRENT_TIME() 這兩個函式是比較常用到的,顧名思義,第一個返回當前日期,第二個返回當前時間 可以在MySQL

資料結構——陣列(2)在有序數列二分查詢

二分查詢的前提要求陣列有序, 查詢思想:每次將待查詢元素k和陣列中間位置mid元素對比,若相等,則查詢成功;若mid元素小於k,則k在陣列後半部分;若mid元素大於k,則在陣列前半部分。然後繼續以此方法搜尋。 實現方法包括:非遞迴法、遞迴法。 #inclu

STL分解字串函式strtok

char *strtok(char *s, const char *delim); 分解字串為一組字串。s為要分解的字串,delim為分隔符字串。 strtok()用來將字串分割成一個個片段。引數s指向欲分割的字串,引數delim則為分割字串,當strtok()在引數s的字

過載實現:int char二分查詢. 函式模板 :對整型 浮點型 字元型 實現氣泡排序

程式:演算法+資料 C++語言的資料:   1、基本型別: 整型,浮點型,字元型,bool型別   2、變數:此塊空間的內容可改變         型別 變數名;//分配空間:以型別       初始化變數:在定義變數同時賦初值       引用:通過名字引用變數的內容  

STL二分查詢 (Binary search in STL)

正確區分不同的查詢演算法count,find,binary_search,lower_bound,upper_bound,equal_range本文是對Effective STL第45條的一個總結,闡述了各種查詢演算法的異同以及使用他們的時機。 首先可供查詢的演算法大致有c

C++STL的upper_bound()函式的使用

首先要#include<algorithm>int a[];upper_bound(a+i,a+j,x)-a返回的是第一個大於x的數的座標upper_bound(a.begin(),a.end(),x)返回的是迭代器low_bound(first,last,x)返

STL二分查詢相關的4個函式

二分查詢的原理非常簡單,但寫出的程式碼中很容易含有很多Bug,二分查詢一文中講解過如何實現不同型別的二分查詢,但是否一定要自己去實現二分查詢呢?答案顯然是否定的,本文將講解STL中與二分查詢有關函式的具體使用方法及其實現原理。 函式使用 STL中與二分查詢相關的函式有

stl二分查找

sin search c++ 指向 元素 font sea lower 查找 binary_search 使用方式 binary_search(區間起始,區間結束後一個,要查找的元素。 #include<bits/stdc++.h> using namespa