C++提高编程 5 STL -常用算法(查找算法)
5.2 常用查找算法
算法简介:
find //查找元素
find_if //按条件查找元素
adjacent_find //查找到相邻重复元素
binary_search //二分法查找
count //统计元素个数
count_if //按条件统计元素个数
5.1 find
功能描述:查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()
函数原型:find(iterator beg, iterator end, value); //value 查找的元素
#include<iostream> using namespace std; #include<vector> #include<algorithm> #include<string> //常用查找容器 find void test1() { vector<int>v; for (int i = 0; i < 10; i++) { v.push_back(i); } //查找容器中 是否有5 这个元素 vector<int>::iterator pos = find(v.begin(), v.end(), 5); if (pos == v.end()) { cout << "无要查找的元素" << endl; } else { cout << "有所查找的元素" << endl; } } class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } //重载 == 底层find知道如何对比person数据类型 bool operator==(const Person& p) { 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 test2() { vector<Person>v; //创建数据 Person p1("张三", 40); Person p2("李四", 50); Person p3("王五", 60); Person p4("赵六", 70); //放入到容器中 v.push_back(p1); v.push_back(p2); v.push_back(p3); v.push_back(p4); Person pp("李四", 50); vector<Person>::iterator pos = find(v.begin(), v.end(), pp); if (pos == v.end()) { cout << "无姓名年龄相同的人" << endl; } else { cout << "有姓名年龄相同的人" << endl; } } int main() { test1(); system("pause"); return 0; }
总结:find可以在容器中找指定的元素,但是要注意 返回值是一个迭代器
5.2.2 find_if
功能描述:按条件查找元素
函数原型:find_if(iterator beg, iterator end, _Pred); //_Pred 函数或谓词(返回bool类型的仿函数)
#include<iostream> using namespace std; #include<vector> #include<algorithm> //常用查找算法 find_if //1、查找内置数据类型 class GreaterFive { public: bool operator()(int val) { return val > 5; } }; void test1() { vector<int>v; for (int i = 0; i < 10; i++) { v.push_back(i); } vector<int>::iterator pos = find_if(v.begin(), v.end(), GreaterFive()); if (pos == v.end()) { cout << "没有大于5的数" << endl; } else { cout << "有大于5的数:" << *pos << endl; } } //2、查找自定义数据类型 int main() { test1(); system("pause"); return 0; }
内置数据类型:

#include<iostream> using namespace std; #include<vector> #include<algorithm> #include<string> //常用查找算法 find_if//2、查找自定义数据类型 class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } string m_Name; int m_Age; }; class Greater20 { public: bool operator()(Person &p) { return p.m_Age > 20; } }; void test2() { vector<Person>v; //创建数据 Person p1("aaa", 10); Person p2("bbb", 20); Person p3("ccc", 30); Person p4("ddd", 40); v.push_back(p1); v.push_back(p2); v.push_back(p3); v.push_back(p4); //找到年龄大于20的人 vector<Person>::iterator it = find_if(v.begin(), v.end(), Greater20()); if (it == v.end()) { cout << "没有找到年龄大于20的人" << endl; } else { cout << "找到年龄大于20的人:" << (*it).m_Name << " " << "年龄:" << it->m_Age << endl; } } int main() { test2(); system("pause"); return 0; }
自定义数据类型:

5.2.3 adjacent_find
功能描述:查找相邻重复元素
函数原型:adjacent_find(iterator beg, iterator end); //查找到相邻重复元素,返回相邻元素的第一个位置的迭代器
#include<iostream> using namespace std; #include<vector> #include<algorithm> //常用查找算法 adjacent_find void test1() { vector<int>v; v.push_back(1); v.push_back(0); v.push_back(0); v.push_back(3); v.push_back(3); v.push_back(0); v.push_back(0); vector<int>::iterator pos = adjacent_find(v.begin(), v.end()); if (pos == v.end()) { cout << "未找到相邻重复元素" << endl; } else { cout << "找到相邻重复元素" << *pos << endl; //找到相邻重复元素0 返回相邻元素的第一个位置的迭代器 } } int main() { test1(); system("pause"); return 0; }
5.2.4 binary_search
功能描述:查找指定元素是否存在
函数原型:bool binary_search(iterator beg, iterator end, value); //查找指定元素,查到返回true,否则返回false。value为查找的元素
注意:在无序序列中不能使用!!!
#include<iostream> using namespace std; #include<vector> #include<algorithm> //常用查找算法 binary_search (二分查找法) void test1() { vector<int>v; v.push_back(0); v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(6); //查找容器中是否有5这个元素 //注意:在无序序列中不能使用!!!(降序也不行) 结果未知 bool ret = binary_search(v.begin(), v.end(), 5); if (ret == false) { cout << "未找到" << endl; } else { cout << "找到了" << endl; //找到了 } } int main() { test1(); system("pause"); return 0; }
5.2.5 count
功能描述:统计元素个数
函数原型:count(iterator beg, iterator end, value); //统计元素出现次数
#include<iostream> using namespace std; #include<vector> #include<algorithm> //常用查找算法 count //1、查找内置数据类型 void test1() { vector<int>v; v.push_back(10); v.push_back(10); v.push_back(20); v.push_back(30); v.push_back(40); int num = count(v.begin(), v.end(), 10); cout << "10的个数为:" << num << endl; //10的个数为:2 } //2、查找自定义数据类型 class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } bool operator==(const Person &p) { if (this->m_Age == p.m_Age) { return true; } else { return false; } } string m_Name; int m_Age; }; void test2() { vector<Person>v; //创建数据 Person p1("aaa", 10); Person p2("bbb", 20); Person p3("ccc", 30); Person p4("ddd", 40); Person p5("eee", 40); v.push_back(p1); v.push_back(p2); v.push_back(p3); v.push_back(p4); v.push_back(p5); Person p("xkl", 40); int num = count(v.begin(), v.end(), p); cout << "与xkl同岁数的人数为:" << num << endl; //与xkl同岁数的人数为:2 } int main() { test1(); test2(); system("pause"); return 0; }
总结:查找自定义数据类型时,需要重载operator==
5.2.6 count_if
功能描述:按条件统计元素出现的个数
函数原型:count_if(iterator beg, iterator end, _Pred); //_Pred谓词
#include<iostream> using namespace std; #include<vector> #include<algorithm> //常用查找算法 count_if class Greater20 { public: bool operator()(int val) { return val > 20; } }; //1、统计内置数据类型 void test1() { vector<int>v; v.push_back(40); v.push_back(10); v.push_back(20); v.push_back(30); v.push_back(40); int num = count_if(v.begin(), v.end(), Greater20()); cout << "容器中大于20的个数为:" << num << endl; //容器中大于20的个数为:3 } //2、统计自定义数据类型 class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } string m_Name; int m_Age; }; class AgeGreater30 { public: bool operator()(const Person &p) { return p.m_Age > 30; } }; void test2() { vector<Person>v; //创建数据 Person p1("aaa", 40); Person p2("bbb", 20); Person p3("ccc", 30); Person p4("ddd", 40); Person p5("eee", 40); v.push_back(p1); v.push_back(p2); v.push_back(p3); v.push_back(p4); v.push_back(p5); //统计大于30岁的人数 int num = count_if(v.begin(), v.end(), AgeGreater30()); cout << "大于20岁的人数为:" << num << endl; //大于20岁的人数为:3 } int main() { test1(); test2(); system("pause"); return 0; }

浙公网安备 33010602011771号