STL常用的查找算法(13)

函数名

头文件

函数功能

adjacent_find

<algorithm>

在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的ForwardIterator .否则返回last.重载版本使用输入的二元操作符代替相等的判断

函数原形

template<class FwdIt> FwdIt adjacent_find(FwdIt first, FwdIt last);

template<class FwdIt, class Pred> FwdIt adjacent_find(FwdIt first, FwdIt last, Pred pr);

binary_search

<algorithm>

在有序序列中查找value,找到返回true.重载的版本实用指定的比较函数对象或函数指针来判断相等

函数原形

template<class FwdIt, class T> bool binary_search(FwdIt first, FwdIt last, const T& val);

template<class FwdIt, class T, class Pred> bool binary_search(FwdIt first, FwdIt last, const T& val,Pred pr);

count

<algorithm>

利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数

函数原形

template<class InIt, class Dist> size_t count(InIt first, InIt last,const T& val, Dist& n);

count_if

<algorithm>

利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数

函数原形

template<class InIt, class Pred, class Dist> size_t count_if(InIt first, InIt last, Pred pr);

equal_range

<algorithm>

功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound

函数原形

template<class FwdIt, class T> pair<FwdIt, FwdIt> equal_range(FwdIt first, FwdIt last,const T& val);

template<class FwdIt, class T, class Pred> pair<FwdIt, FwdIt> equal_range(FwdIt first, FwdIt last,const T& val, Pred pr);

find

<algorithm>

利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较.当匹配时,结束搜索,返回该元素的一个InputIterator

函数原形

template<class InIt, class T> InIt find(InIt first, InIt last, const T& val);

find_end

<algorithm>

在指定范围内查找"由输入的另外一对iterator标志的第二个序列"的最后一次出现.找到则返回最后一对的第一个ForwardIterator,否则返回输入的"另外一对"的第一个ForwardIterator.重载版本使用用户输入的操作符代替等于操作

函数原形

template<class FwdIt1, class FwdIt2> FwdIt1 find_end(FwdIt1 first1, FwdIt1 last1,FwdIt2 first2, FwdIt2 last2);

template<class FwdIt1, class FwdIt2, class Pred> FwdIt1 find_end(FwdIt1 first1, FwdIt1 last1,FwdIt2 first2, FwdIt2 last2, Pred pr);

find_first_of

<algorithm>

在指定范围内查找"由输入的另外一对iterator标志的第二个序列"中任意一个元素的第一次出现。重载版本中使用了用户自定义操作符

函数原形

template<class FwdIt1, class FwdIt2> FwdIt1 find_first_of(FwdIt1 first1, FwdIt1 last1,FwdIt2 first2, FwdIt2 last2);

template<class FwdIt1, class FwdIt2, class Pred> FwdIt1 find_first_of(FwdIt1 first1, FwdIt1 last1,FwdIt2 first2, FwdIt2 last2, Pred pr);

find_if

<algorithm>

使用输入的函数代替等于操作符执行find

 

template<class InIt, class Pred> InIt find_if(InIt first, InIt last, Pred pr);

lower_bound

<algorithm>

返回一个ForwardIterator,指向在有序序列范围内的可以插入指定值而不破坏容器顺序的第一个位置.重载函数使用自定义比较操作

函数原形

template<class FwdIt, class T> FwdIt lower_bound(FwdIt first, FwdIt last, const T& val);

template<class FwdIt, class T, class Pred> FwdIt lower_bound(FwdIt first, FwdIt last, const T& val, Pred pr);

upper_bound

<algorithm>

返回一个ForwardIterator,指向在有序序列范围内插入value而不破坏容器顺序的最后一个位置,该位置标志一个大于value的值.重载函数使用自定义比较操作

函数原形

template<class FwdIt, class T> FwdIt upper_bound(FwdIt first, FwdIt last, const T& val);

template<class FwdIt, class T, class Pred> FwdIt upper_bound(FwdIt first, FwdIt last, const T& val, Pred pr);

search

<algorithm>

给出两个范围,返回一个ForwardIterator,查找成功指向第一个范围内第一次出现子序列(第二个范围)的位置,查找失败指向last1,重载版本使用自定义的比较操作

函数原形

template<class FwdIt1, class FwdIt2> FwdIt1 search(FwdIt1 first1, FwdIt1 last1,FwdIt2 first2, FwdIt2 last2);

template<class FwdIt1, class FwdIt2, class Pred> FwdIt1 search(FwdIt1 first1, FwdIt1 last1, FwdIt2 first2, FwdIt2 last2, Pred pr);

search_n

<algorithm>

在指定范围内查找val出现n次的子序列。重载版本使用自定义的比较操作

函数原形

template<class FwdIt, class Dist, class T> FwdIt search_n(FwdIt first, FwdIt last,Dist n, const T& val);

template<class FwdIt, class Dist, class T, class Pred> FwdIt search_n(FwdIt first, FwdIt last,Dist n, const T& val, Pred pr);

查找算法(13个):判断容器中是否包含某个值

#include <iostream>        
#include<string>        
#include <vector>        
#include <list>        
#include <set>        
#include <map>        
#include <algorithm>        
#include <functional>  
#include<iterator>
using namespace std;

//查找是否有相邻元素 返回第一个重复元素的下标
void display()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(3);
	v.push_back(3);
	v.push_back(5);
	v.push_back(5);

	vector<int>::iterator it;

	it = adjacent_find(v.begin(),v.end());

	if (it==v.end())
	{
		cout<<"not found adjacent element"<<endl;
	}
	else
	{
		int index = distance(v.begin(),it);
		cout<<"重复元素的下标:"<<index<<endl;
		cout<<"重复元素的值:"<<*it<<endl;
	}
}
//二分查找 速度快 时间复杂度最坏logn
void display2()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(3);
	v.push_back(5);
	v.push_back(7);
	v.push_back(9);

	bool b  = binary_search(v.begin(),v.end(),7);

	if (b)
	{
		cout<<"find"<<endl;
	}
	else
	{
		cout<<"not find"<<endl;
	}
}

//统计重复元素的个数 返回重复的个数 没有返回0
void display3()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(3);
	v.push_back(3);
	v.push_back(3);
	v.push_back(5);
	v.push_back(7);
	v.push_back(9);

	int num  = count(v.begin(),v.end(),3);
	cout<<"num:"<<num<<endl;
}
//查找元素大于3的个数 count()可以对基础类型数据进行查找
//count_if()可以对自定义数据类型进行查找 通过谓词

bool GreaterThree(int &i)
{
	if (i>3)
	{
		return true;
	}
	else
	{
		return false;
	}
}
void display4()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(3);
	v.push_back(3);
	v.push_back(3);
	v.push_back(5);
	v.push_back(7);
	v.push_back(9);

	int num  = count_if(v.begin(),v.end(),GreaterThree);

	cout<<"num:"<<num<<endl;
}

//find查找元素在容器或数组中的下标 
void display5()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(3);
	v.push_back(3);
	v.push_back(3);
	v.push_back(5);
	v.push_back(7);
	v.push_back(9);

	int myints[] = { 10, 20, 30, 40 };
	int * p;

	p = find (myints, myints+4, 30);

	cout<<*p<<endl;

	vector<int>::iterator it  = find(v.begin(),v.end(),3);

	int num = distance(v.begin(),it);

	cout<<"num:"<<num<<endl;
}

//find_if查找元素在容器或数组中的下标 

bool findFirstEven(int &i)
{
	if (i%2==0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

void display6()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(3);
	v.push_back(3);
	v.push_back(5);
	v.push_back(7);
	v.push_back(9);

	vector<int>::iterator it  = find_if(v.begin(),v.end(),findFirstEven);

	int num = distance(v.begin(),it);

	cout<<"num:"<<num<<endl;
}
int main()
{
	display6();
	system("pause");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值