C++中的lower_bound和upper_bound函數

轉自:http://bbqub.cnblogs.com/p/7774756.html

關於lower_bound和upper_bound

共同點

函數組成:

一個數組元素的地址(或者數組名來表示這個數組的首地址,用來表示這個數組的開頭比較的元素的地址,不一定要是首地址,只是用於比較的“首”地址)+ 一個數組元素的地址(對應的這個數組裏邊任意一個元素的地址,表示這個二分裏邊的比較的”結尾’地址)+ 你要二分查找的那個數。

例如:

lower_bound(r[x].begin(),r[x].end(),l)

upper_bound(r[x].begin(),r[x].end(),R)

區別

lower_bound與upper_bound的返回值是不同的

lower_bound

返回第一個大於等於x的數的地址
例如數組 1 1 1 3 5

而需要找的那個數是2,怎麼返回呢,

就是返回那個第一個大於 2 的數的地址,就是返回3的位置,那麼再有一組數據就是5個數1 1 1 3 5,還是需要找尋2,那麼該返回什麼呢?就是第一個3的地址.

upper_bound

返回第一個大於x的數的地址
也就是說如果在5個數 1 , 1, 2 , 2 , 4 ,裏邊尋找3,那麼就會返回4的地址

代碼

lower_bound

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int k,n=10;
int a[10]={1,1,1,3,3,5,5,5,5,6};
int main()
{
    for(int i=0;i<n;i++)cout<<a[i]<<" ";
    cout<<endl;
   while(scanf("%d",&k))
   {
       cout<<k<<"的第一個大於等於它的位置在"<<((lower_bound(a,a+n,k))-a)+1<<endl;
   }
}

upper_bound

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int k,n=10;
int a[10]={1,1,1,3,3,5,5,5,5,6};
int main()
{
    for(int i=0;i<n;i++)cout<<a[i]<<" ";
    cout<<endl;
   while(scanf("%d",&k))
   {
       cout<<k<<"的第一個大於它的位置在"<<((upper_bound(a,a+n,k))-a)+1<<endl;
   }
}

有關vector的其他函數

頭文件

#include<vector>

vector聲明及初始化

vector<int> vec;        //聲明一個int型向量
vector<int> vec(5);     //聲明一個初始大小爲5的int向量
vector<int> vec(10, 1); //聲明一個初始大小爲10且值都是1的向量
vector<int> vec(tmp);   //聲明並用tmp向量初始化vec向量
vector<int> tmp(vec.begin(), vec.begin() + 3);  //用向量vec的第0個到第2個值初始化tmp
int arr[5] = {1, 2, 3, 4, 5};   
vector<int> vec(arr, arr + 5);      //將arr數組的元素用於初始化vec向量
//說明:當然不包括arr[4]元素,末尾指針都是指結束元素的下一個元素,
//這個主要是爲了和vec.end()指針統一。
vector<int> vec(&arr[1], &arr[4]); //將arr[1]~arr[4]範圍內的元素作爲vec的初始值

vector基本操作

容量

    向量大小: vec.size();
    向量最大容量: vec.max_size();
    更改向量大小: vec.resize();
    向量真實大小: vec.capacity();
    向量判空: vec.empty();
    減少向量大小到滿足元素所佔存儲空間的大小: vec.shrink_to_fit(); //shrink_to_fit

修改

    多個元素賦值: vec.assign(); //類似於初始化時用數組進行賦值
    末尾添加元素: vec.push_back();   //例vec.insert(vec.begin()+i,a);在第i+1個元素前面插入a;
    末尾刪除元素: vec.pop_back();    //例vec.erase(vec.begin()+2);刪除第3個元素  vec.erase(vec.begin()+i,vec.end()+j);刪除區間[i,j-1];區間從0開始
    任意位置插入元素: vec.insert();
    任意位置刪除元素: vec.erase();
    交換兩個向量的元素: vec.swap();
    清空向量元素: vec.clear();

迭代器

    開始指針:vec.begin();
    末尾指針:vec.end(); //指向最後一個元素的下一個位置
    指向常量的開始指針: vec.cbegin(); //意思就是不能通過這個指針來修改所指的內容,但還是可以通過其他方式修改的,而且指針也是可以移動的。
    指向常量的末尾指針: vec.cend();

元素的訪問

    下標訪問: vec[1]; //並不會檢查是否越界
    at方法訪問: vec.at(1); //以上兩者的區別就是at會檢查是否越界,是則拋出out of range異常
    訪問第一個元素: vec.front();
    訪問最後一個元素: vec.back();
    返回一個指針: int* p = vec.data(); //可行的原因在於vector在內存中就是一個連續存儲的數組,所以可以返回一個指針指向這個數組。這是是C++11的特性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章