如果我们需要对一个vector进行二分查找,和数组的写法有点区别:
%25JB5F(YD8DC3KPJ%7DVC.png)
向量和数组的一个不同点在于,vector中的元素区间是左闭右开,初始查找状态如下:
DG5C%5BERZ2DC0%7B2.png)
后续的迭代方法就和数组中的二分查找类似,我就不再过多的推导
代码如下:
#include<iostream>
#include<vector>
using namespace std;
template <typename T>
bool binary_search_vector (const T & key , typename vector<T> :: const_iterator data , size_t N) //第二个参数是一个向量中的常量迭代器
{
size_t low = 0;
size_t high = N;
while(low < high) //循环条件和数组中的略有不同
{
size_t middle = low + (high - low) / 2;
if(key < *(data + middle))
high = middle;
else if(*(data + middle) < key)
low = middle + 1;
else
return true;
}
return false;
}
int main()
{
vector<int> v = {1,2,3,4,5};
cout << binary_search_vector(2 , v.cbegin() , 5);
cout << binary_search_vector(0 , v.cbegin() , 5);
cout << binary_search_vector(2 , v.cbegin() + 2 , 3);
cout << binary_search_vector(0 , v.cbegin() , 0);
return 0;
}
总结:其实不论是数组的二分查找还是向量的二分查找,它们的世家复杂度都是一样的,分析一下就能知道它们是O(logn),比一般的遍历查找速度快了很多,也推荐大家在平时的编程和比赛中多使用二分查找。






Comments NOTHING