查找算法adjacent_find, binary_search, includes, lower_bound, upper_bound, equal_range,用法相似,但容易混淆,特查找多处,总结各自的使用方法和限制要求,总结如下。
1. adjacent_find:
iterator adjacent_find(iterator first, iterator end)在[first,end)中找第一个连续两个相等数,并返回指向第一个数的迭代器;
或iterator adjacent_find(iterator first, iterator end,comp);//comp是一个二元仿函数,返回第一个连续两个数满足comp关系,并返回第一个数的迭代器;
eg:
boolparity_equal(int x, int y)
{
return (x<y);
}
int list1[8] = {9,7,5,5, 3,6,2,1 };
vector<int>vecList(list1, list1 + 8);
vector<int>::iteratorvecItr;
vecItr = adjacent_find(vecList.begin(),vecList.end());//vecItr指向vecList[2]
vecItr =adjacent_find(vecList.begin(), vecList.end(), parity_equal);//vecItr指向vecList[4]
下面的几种算法则要求元素是已经排序的:
2. binary_search():
二分查找,作用:在已序区间中判断搜索指定元素是否存在,返回bool值。要求元素已经从小到大排好序;
template<class ForwardIterator, class T>
bool binary_search ( ForwardIterator first,ForwardIterator last, const T& value );
//在[first,last)中判断是否存在值为value的元素
template<class ForwardIterator, class T, class Compare>
bool binary_search ( ForwardIterator first,ForwardIterator last, const T& value, Compare comp );
//在[first,last)中判断是否存在元素x,使得comp(x,value)返回true;
eg:
bool res = binary_search(vecList.begin(),vecList.end(), 1, parity_equal);
3. includes():
在指定区间中判断若干元素是否存在,包含查找,返回bool值。//它要求
template <class InputIterator1, classInputIterator2>
bool includes ( InputIterator1 first1,InputIterator1 last1, InputIterator2 first2, InputIterator2 last2 );
//判断[first1,last1)中是否包含[first2, last2)的全部元素;元素必须从小往大排序,否则要用第三个参数,如下;
template <class InputIterator1, classInputIterator2, class Compare>
bool includes ( InputIterator1 first1,InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
//判断[first1, last1)中是否包含[first2,last2)的全部元素;元素按comp排序,可以是从大往小;
eg:
bool parity_equal(int x, int y)
{
return(x>y);
}
bool res = includes(vecList.begin(),vecList.end(), subv.begin(), subv.end());//这种方式要求序列是从小往大排序的;
res = includes(vecList.begin(),vecList.end(), subv.begin(), subv.end(), parity_equal);//要求序列的排序方式与parity_equal定义的排列方式一致即可,可小->大,也可大->小
4. lower_bound()
返回第一个>=给定元素的元素位置;要求元素从小到大排列
5. upper_bound()
返回第一个>给定元素的元素位置; 要求元素从小到大排列
6. equal_range()
返回lower_bound()和upper_bound()返回的值。是一对迭代器,pair<vector<int>::iterator,vector<int>::iterator>,要求元素从小到大排列
eg:
int vv[4] ={2,3,4,5};
vector<int>vecList(vv, vv + 4);
vector<int>::iteratorvecItr;
vecItr= lower_bound(vecList.begin(), vecList.end(), 2); //>=2的第一个元素的迭代器
vecItr= upper_bound(vecList.begin(), vecList.end(), 4);// >4的第一个元素的迭代器
pair<vector<int>::iterator,vector<int>::iterator> vecpair;
vecpair=equal_range(vecList.begin(),vecList.end(), 3);
copy(vecpair.first,vecpair.second, ostream_iterator<int>(cout, " "));//输出3
其间参考了如下几篇博客:
http://blog.csdn.net/u010579068/article/details/50503717
http://blog.csdn.net/jerryjbiao/article/details/6838528
http://blog.csdn.net/zhongkeli/article/details/6883288