STL中查找方法用法总结-adjacent_find, binary_search, includes, lower_bound, upper_bound, equal_range

查找算法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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值