STL--常用的查找算法

目录

常用的查找算法

1. find

 2. find_if

 3. adjacent_find

 4. binary_search

 5. count

 6. count_if


常用的查找算法

  • find                           // 查找元素
  • find_if                       // 按条件查找
  • adjacent_find            // 查找相邻重复元素
  • binary_search           // 二分法查找
  • count                       // 统计元素个数
  • count_if                   // 按条件统计元素个数

1. find

查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器

  • find(iterator  beg,  iterator  end,  value);
  • 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
  • beg  起始迭代器
  • end   结束迭代器
  • value  查找的元素
	#include<iostream>
	using namespace std;
	#include<algorithm>
	#include<vector>
	
	// 常用的查找算法
	// find
	// 1查找  内置数据类型
	void test01()
	{
		vector<int> v;
		for(int i=0;i<10;i++)
		{
			v.push_back(i);
		}
		// 查找容器中是否有5
		vector<int>::iterator it = find(v.begin(),v.end(),5);
		if(it==v.end())
		cout<<"该元素不存在"<<endl;
		else
		cout<<"找到:"<<*it<<endl;
	}
	
	class person
	{
	public:
		person(string name,int age)
		{
			this->name=name;
			this->age=age;
		}
	
		// 重载==  用于比较自定义类型数据
		bool operator==(const person&p)
		{
			if(this->name==p.name&&this->age==p.age)
			return true;
			else
			return false;
		}
	
		string name;
		int age;
	};
	// 2 查找   自定义数据类型
	void test02()
	{
		vector<person> v1;
		// 创建数据
		person p1("aa",12);
		person p2("bb",23);
		person p3("cc",34);
		person p4("dd",45);
	
		v1.push_back(p1);
		v1.push_back(p2);
		v1.push_back(p3);
		v1.push_back(p4);
	
		// 找有没有和这个人是一样的
		person pp("dd",45);
	
		vector<person>::iterator it = find(v1.begin(),v1.end(),pp);
		// 需要重载==  不然没法比较
		if(it==v1.end())
		cout<<"没有找到"<<endl;
		else
		cout<<"找到:"<<"姓名:"<<it->name<<" 年龄:"<<it->age<<endl;
	}
	int main ()
	{
		test01();
		test02();
		return 0;
	}

 2. find_if

按条件查找元素

  • find_if(iterator  beg,  iterator  end,  _Pred);
  •  按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器
  • beg  起始迭代器
  • end  结束迭代器
  • _Pred  函数或者谓词(返回bool类型的仿函数)
	#include<iostream>
	using namespace std;
	#include<algorithm>
	#include<vector>
	
	// 常用的查找算法
	// find_if
	// 1查找  内置数据类型
	
	// 要提供仿函数
	class create
	{
	public:
		bool operator()(int val)
		{
			return val>5;
		}
	};
	void test01()
	{
		vector<int> v;
		for(int i=0;i<10;i++)
		{
			v.push_back(i);
		}
		// 查找容器中是否有5
		vector<int>::iterator it = find_if(v.begin(),v.end(),create());
		if(it==v.end())
		cout<<"该元素不存在"<<endl;
		else
		cout<<"找到大于5的数字:"<<*it<<endl;
	}
	
	class person
	{
	public:
		person(string name,int age)
		{
			this->name=name;
			this->age=age;
		}
	
	
		string name;
		int age;
	};
	
	// 提供仿函数
	class create20
	{
	public:
		bool operator()(person &p)
		{
			if(p.age>20)
			return true;
			else
			return false;
		}
	};
	// 2 查找   自定义数据类型
	void test02()
	{
		vector<person> v1;
		// 创建数据
		person p1("aa",12);
		person p2("bb",23);
		person p3("cc",34);
		person p4("dd",45);
	
		v1.push_back(p1);
		v1.push_back(p2);
		v1.push_back(p3);
		v1.push_back(p4);
	
	
	
		vector<person>::iterator it = find_if(v1.begin(),v1.end(),create20());
		if(it==v1.end())
		cout<<"没有找到"<<endl;
		else
		cout<<"找到年龄大于20的人"<<endl<<"\t姓名:"<<it->name<<" 年龄:"<<it->age<<endl;
	}
	int main ()
	{
		test01();
		test02();
		return 0;
	}

 3. adjacent_find

查找相邻重复元素

 

  • adjacent_find(iterator  beg,  iterator  end);
  • 查找相邻重复元素,返回相邻元素的第一个位置的迭代器
  • beg  起始迭代器
  • end  结束迭代器
	#include<iostream>
	using namespace std;
	#include<algorithm>
	#include<vector>
	
	// 常用的查找算法
	// adjacent_find  查找相邻元素
	int main ()
	{
		vector<int> v;
		v.push_back(2);
		v.push_back(3);
		v.push_back(2);
		v.push_back(2);
		v.push_back(4);
		vector<int>::iterator it = adjacent_find(v.begin(),v.end()); // 返回的是迭代器
		if(it==v.end())
		cout<<"相邻元素不存在"<<endl;
		else
		cout<<"相邻元素的第一个数字是:"<<*it<<endl;
		return 0;
	}

查找指定元素是否存在

  • bool  binary_search(iterator  beg,  iterator  end,  value);
  • 查找指定的的元素,查找到返回true,没找到返回false
  • 注意:在无序序列中不可以使用
  • beg  起始迭代器
  • end  结束迭代器
  • value  查找得到元素
	#include<iostream>
	using namespace std;
	#include<algorithm>
	#include<vector>
	
	// 常用的查找算法
	// binary_search  查找元素是否存在
	int main ()
	{
		vector<int> v;
		for(int i=0;i<10;i++)
		{
			v.push_back(i);
		}
		v.push_back(2); // 插入一个2打乱原本的排序
		// 查找的容器必须是一个有序的序列
		// 容器必须是有序的序列,如果是无序的序列那么结果未知
		bool ret = binary_search(v.begin(),v.end(),9);
		if(ret==true)
		cout<<"找到指定的数据"<<endl;
		else
		cout<<"没有找到"<<endl;
		return 0;
	}

 5. count

统计元素个数

  • count(iterator  beg, iterator  end,  value);
  • 统计元素出现次数
  • beg  起始迭代器
  • end  结束迭代器
  • value  统计的元素
	#include<iostream>
	using namespace std;
	#include<algorithm>
	#include<vector>
	
	// 常用的查找算法
	// count 统计元素个数
	// 1统计  内置数据类型
	
	void test01()
	{
		vector<int> v;
		for(int i=0;i<100;i++)
		{
			v.push_back(4);
		}
	
		int num = count(v.begin(),v.end(),4);
		cout<<"4有 "<<num<<" 个"<<endl;
	}
	
	// 统计自定义数据类型
	class person
	{
	public:
		person(string name,int age)
		{
			this->name=name;
			this->age=age;
		}
	
		// 重载==
		bool operator==(const person&p)// 要加const防止修改person的内容
		{
			if(this->age==p.age)
			return true;
			else
			return false;
		}
		string name;
		int age;
	};
	// 统计自定义类型数据
	void test02()
	{
		vector<person> v1;
		person p1("嗷嗷",234);
		person p2("拜拜",123);
		person p3("存储",234);
		person p4("等等",567);
		person p5("嗯嗯",789);
	
		v1.push_back(p1);
		v1.push_back(p2);
		v1.push_back(p3);
		v1.push_back(p4);
		v1.push_back(p5);
	
		person p("方法",234);
		// 查找与p年龄相同的有多少人
		int num = count(v1.begin(),v1.end(),p);
		cout<<"和 "<<p.name<<"年龄相同的有 "<<num<<" 人,都是"<<p.age<<"岁"<<endl;
	}
	
	int main ()
	{
		test01();
		test02();
		return 0;
	}

 6. count_if

按条件同级元素个数

  • count_if(iterator  bge,  iterator  end,  _Pred);
  • 按条件同级元素出现次数
  • beg  返回起始迭代器
  • end  返回结束迭代器
  • _Pred  谓词
	#include<iostream>
	using namespace std;
	#include<algorithm>
	#include<vector>
	
	// 常用的查找算法
	// count_if 统计元素个数
	// 1查找  内置数据类型
	
	// 仿函数
	class create
	{
	public:
		int operator()(int val)
		{
			return val>20;
		}
	};
	void test01()
	{
		vector<int> v;
		for(int i=0;i<100;i++)
		{
			v.push_back(i);
		}
		
		int num1=0;
		for(vector<int>::iterator it=v.begin();it!=v.end();it++)
		{
			if(num1==20)
			{
				cout<<*it<<endl;
				num1=0;
			}
			else
			{
				cout<<*it<<" ";
				num1++;
			}
		}
		cout<<endl;
		int num = count_if(v.begin(),v.end(),create());
		cout<<"大于20的元素个数 "<<num<<" 个"<<endl;
	}
	
	// 统计自定义数据类型
	class person
	{
	public:
		person(string name,int age)
		{
			this->name=name;
			this->age=age;
		}
	
		string name;
		int age;
	};
	// 仿函数
	class create200
	{
	public:
		bool operator()(const person& p)   // 必须加const限定,不允许修改
		{
			if(p.age>200)
			return true;
			else
			return false;
		}
	};
	void test02()
	{
		vector<person> v1;
		person p1("嗷嗷",234);
		person p2("拜拜",123);
		person p3("存储",234);
		person p4("等等",567);
		person p5("嗯嗯",789);
	
		v1.push_back(p1);
		v1.push_back(p2);
		v1.push_back(p3);
		v1.push_back(p4);
		v1.push_back(p5);
	
		person p("方法",234);
		// 查找与p年龄相同的有多少人
		int num = count_if(v1.begin(),v1.end(),create200());
		cout<<"比"<<p.name<<"年龄"<<p.age<<"大的有 "<<num<<" 人"<<endl;
	}
	
	int main ()
	{
		test01();
		test02();
		return 0;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值