1.find() //查找元素
2.find_if() //按条件查找元素
3.adjacent_find() //查找相邻重复元素
4.binary_search() //二分查找法
5.count //统计元素个数
6.count_if //按条件统计元素个数
———————————————————————————————
1.原型:find(iterator beg,iterator end,value)
注意find函数会返回迭代器位置——找到返回对应位置,没有找到返回容器末尾位置
iterator beg:源容器初始位置
iterator end:原容器末尾位置
value:查找的元素
对于非自定义数据查找:
#include <iostream> using namespace std; #include <algorithm> #include <vector> //查找非自定义数据类型 void test01() { vector<int> v; for(int i=0;i<4;i++) v.push_back(i); vector<int>::iterator it = find(v.begin(),v.end(),2);//find会返回迭代器位置,找到返回对应位置,没找到返回v.end() if(it == v.end()) //写一个判断语句,判断迭代器返回位置是否为末尾位置 { cout<<"没有找到"<<endl; } else { cout<<"找到值为"<<*it<<endl; } } int main() { test01(); return 0; }
对于自定义类型的查找:
#include <iostream> using namespace std; #include <algorithm> #include <vector> #include <string> class Person { public: Person(string name,int age) { this->m_name = name; this->m_age = age; } //*************************************************** //重载== 让底层find知道怎么查找 bool operator==(const Person &p) //要加const { if(this->m_name == p.m_name && this->m_age == p.m_age) { return true; } else { return false; } } //*************************************************** string m_name; int m_age; }; void test02() { vector<Person> v; Person p1("小明",12); Person p2("小王",15); Person p3("小红",17); v.push_back(p1); v.push_back(p2); v.push_back(p3); //自定义一个测试类型 Person P("小明",13); vector<Person>::iterator it = find(v.begin(),v.end(),P); if(it == v.end()) { cout<<"没有找到"<<endl; } else { cout<<"找到了姓名:"<<it->m_name<<" 年龄:"<<it->m_age<<endl; } } int main() { test02(); return 0; }
———————————————————————————————
2.函数原型:find_if(iterator beg,iterator end,_func())
iterator beg:容器中初始位置
iterator end:容器中末尾位置
_func:函数对象,加谓词(针对于内置数据类型与自定义数据类型)
内置数据类型:
#include <iostream> using namespace std; #include <algorithm> #include <vector> //***************************************** //我们用find_if找大于10的数 class Comp { public: bool operator()(int val) { return val>10; } }; //***************************************** void test() { vector<int> v; v.push_back(5); v.push_back(10); v.push_back(15); vector<int>::iterator it = find_if(v.begin(),v.end(),Comp()); if(it == v.end()) { cout<<"未找到该元素"<<endl; } else { cout<<"找到该元素为:"<<*it<<endl; } } int main() { test(); return 0; }
自定义数据类型:
#include <iostream> using namespace std; #include <algorithm> #include <vector> #include <string> //自定义数据类型 class Person { public: Person(string name,int age) //构造函数 { this->m_name = name; this->m_age = age; } string m_name; int m_age; }; //***************************************** class Comp { public: bool operator()(Person &p) { return p.m_age>10; //这里条件设置为年龄大于10,可以自定义条件 } }; //***************************************** void test() { vector<Person> v; //构造对象 Person p1("aaa",20); Person p2("bbb",2); Person p3("ccc",15); //插入容器 v.push_back(p1); v.push_back(p2); v.push_back(p3); vector<Person>::iterator it = find_if(v.begin(),v.end(),Comp()); if(it == v.end()) { cout<<"未找到该位置"<<endl; } else { cout<<"找到该位置"<<"姓名为:"<<it->m_name<<"年龄为:"<<it->m_age<<endl; //从前往后找符合条件的 } } int main() { test(); return 0; }
—————————————————
3.adjacent_find:查找相邻及重复的元素
原型:adjacent_find(iterator beg,iterator end)
iterator beg:迭代器初始位置
iterator end:迭代器末尾位置
函数返回迭代器位置,找到返回对应迭代器,没有找到返回容器的末尾
#include <iostream> using namespace std; #include <vector> #include <algorithm> //常用查找算法 adjacent_find 查找相邻重复的元素 void test() { vector<int> v; v.push_back(2); v.push_back(1); v.push_back(3); v.push_back(3); vector<int>::iterator it = adjacent_find(v.begin(),v.end()); if(it == v.end()) { cout<<"没有找到"<<endl; } else { cout<<"找到,为"<<*it<<endl; } } int main() { test(); return 0; }
———————————————————————————————
4.binary_search() 二分查找
前提:容器中的数应当为有序的
返回值:返回的是bool类型
函数原型:binary_search(iterator beg,iterator end)
iterator beg:容器初始位置
iterator end:容器末尾位置
#include <iostream> using namespace std; #include <vector> #include <algorithm> void test() { vector<int> v; //采用binary_search容器中必须是有序的数 for(int i=0;i<10;i++) v.push_back(i); bool ret = binary_search(v.begin(),v.end(),8); //返回的是bool值 if(ret) { cout<<"找到了"<<endl; } else { cout<<"未找到"<<endl; } } int main() { test(); return 0; }
———————————————————————————————
5.count() 查找对应相同的数量
返回值:数量
分两种:内置数据类型如int,double,自定义数据类型 class
函数原型:count(iterator beg,iterator end,num)
iterator beg:容器初始位置
iterator end:容器末尾位置
num:对应数据
内置数据类型
#include <iostream> using namespace std; #include <vector> #include <algorithm> void test() { vector<int> v; v.push_back(2); v.push_back(1); v.push_back(2); v.push_back(2); int num = count(v.begin(),v.end(),2); cout<<"有"<<num<<"个相同的数据"<<endl; } int main() { test(); return 0; }
自定义数据类型
#include <iostream> using namespace std; #include <vector> #include <algorithm> class Person { public: Person(string name,int age) { this->m_name = name; this->m_age = age; } //********************************************* bool operator==(const Person& p) //这里必须加const为了与底层相同 { //这里我们只要求它们的年龄相同 if(this->m_age == p.m_age) { return true; } else { return false; } } //********************************************* string m_name; int m_age; }; void test() { vector<Person> v; //创建对象 Person p1("a",15); Person p2("b",16); Person p3("c",15); Person p4("d",15); v.push_back(p1); v.push_back(p2); v.push_back(p3); v.push_back(p4); //创建一个测试例 Person P("e",15); int num = count(v.begin(),v.end(),P); cout<<"与e同学年龄相同的有"<<num<<"个"<<endl; } int main() { test(); return 0; }
———————————————————————————————
6.count_if() 根据条件查找数据
原型:count_if(iterator beg,iterator end,_func)
iterator beg:容器初始位置
iterator end:容器末尾位置
_func:函数对象
返回值:数字
分为内置数据类型和自定义数据类型
内置数据类型
#include <iostream> using namespace std; #include <vector> #include <algorithm> //********************************************* //自己定义一个类 class compar { public: bool operator()(int val) //写一个bool类型的谓词 { return val>20; } }; //********************************************* void test() { vector<int> v; v.push_back(5); v.push_back(10); v.push_back(20); v.push_back(30); int num = count_if(v.begin(),v.end(),compar()); cout<<"符合条件的有"<<num<<"个"<<endl; } int main() { test(); return 0; }
自定义数据类型
#include <iostream> using namespace std; #include <vector> #include <algorithm> class Person { public: Person(string name,int age) { this->m_name = name; this->m_age = age; } string m_name; int m_age; }; //********************************************* //再自定义一个类 class compar { public: bool operator()(const Person& p) //谓词 { return p.m_age >20; } }; //********************************************* void test() { vector<Person> v; //创建对象 Person p1("a",15); Person p2("b",16); Person p3("c",30); Person p4("d",20); v.push_back(p1); v.push_back(p2); v.push_back(p3); v.push_back(p4); //创建一个测试例 int num = count_if(v.begin(),v.end(),compar()); cout<<"大于20岁的同学有"<<num<<"个"<<endl; } int main() { test(); return 0; }