目录
常用的查找算法
- 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;
}
4. binary_search
查找指定元素是否存在
- 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;
}