C++中的STL函数对象和常用算法 Posted on 2022-12-11 19:24:33 2022-12-11 19:37:03 by Author 摘要 c++ 学习笔记,STL函数对象和常用算法的学习笔记 STL-函数对象 概念: - 重载函数调用操作符的类,其对象称为函数对象。 - 函数对象使用重载的()时候,行为类似函数调用,也叫仿函数 - 本质:函数对象(仿函数)是一个类,不是一个函数 函数对象的使用: - 函数对象在使用时候,可以像普通函数那样调用,可以有参数,也可以有返回值。 - 函数对象超出普通函数的概念,函数对象可以有自己的状态 - 函数对象可以作为参数传递 ```c++ #include<iostream> #include<string> using namespace std; class MyAdd{ public: int operator()(int v1,int v2){ return v1+v2; } }; void test01(){ MyAdd myadd; cout<<myadd(10,10)<<endl; } class MyPrint{ public: MyPrint(){ this->count = 0; } void operator()(string str){ cout<<str<<endl; this->count++; } int count; }; void test02(){ MyPrint myprint; myprint("hello,world!"); myprint("hello,world!"); cout<<"myPrint调用的状态:"<<myprint.count<<endl; } void doPrint(MyPrint &mp,string test){ mp(test); } void test03(){ MyPrint myprint; doPrint(myprint,"hello c++"); } int main(){ test02(); test03(); return 0; } ``` ##### 谓词 - 返回bool类型的仿函数称为谓词 - 如果operator()接受一个参数,那么叫一元谓词 - 如果operator()接受两个参数,那么叫二元谓词 - ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; class GreaterFive{ public: //谓词返回值为bool, bool operator()(int val){ return val>5; } }; void test01(){ vector<int>v; for(int i=1;i<9;i++){ v.push_back(i); } vector<int>::iterator it = find_if(v.begin(),v.end(),GreaterFive()); if(it==v.end()){ cout<<"未找到"<<endl; }else{ cout<<*it<<endl; } } class myCompare{ public: bool operator()(int val1,int val2){ return val1>val2; } }; void test02(){ vector<int>v; for(int i=1;i<9;i++){ v.push_back(i); } v.push_back(50); v.push_back(20); v.push_back(35); v.push_back(60); //使用函数对象,改变算法策略,改变排序规则为从大到小 sort(v.begin(),v.end(),myCompare()); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } cout<<endl; } int main(){ test02(); return 0; } ``` ##### 内建的函数对象 - 算数仿函数 - 关系仿函数 - 逻辑仿函数 算数仿函数: - template<class T>negate<t>//取反仿函数 - template<class T> plus<T>;//加法仿函数 - ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> using namespace std; void test01(){ negate<int> n; cout<<n(50)<<endl; plus<int>p; cout<<p(50,20)<<endl; } int main(){ test01(); return 0; } ``` 关系仿函数: - template<class T> bool greater<T> - ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> using namespace std; class MyCompare{ public: bool operator()(int v1,int v2){ return v1>v2; } }; void test01(){ vector<int> v; v.push_back(200); v.push_back(20); v.push_back(500); v.push_back(10); v.push_back(43); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } cout<<endl; // sort(v.begin(),v.end(),MyCompare()); //内置的仿函数greater<T>() sort(v.begin(),v.end(),greater<int>()); cout<<"排序后的:"<<endl; for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } plus<int>p; cout<<p(50,20)<<endl; } int main(){ test01(); return 0; } ``` ##### 逻辑仿函数 函数原型: - template<class T> bool logical_and<T> - template<class T>bool logical_or<T> - template<class T>bool logical_not<T> - ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> using namespace std; void test01(){ vector<bool> v; v.push_back(true); v.push_back(false); v.push_back(false); v.push_back(true); v.push_back(true); for(vector<bool>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } cout<<endl; vector<bool>v2; v2.resize(v.size()); transform(v.begin(),v.end(),v2.begin(),logical_not<bool>()); for(vector<bool>::iterator it=v2.begin();it!=v2.end();it++){ cout<<*it<<" "; } } int main(){ test01(); return 0; } ``` #### STL-常用算法 - 算法主要由头文件:<algorithm> <functional> <numeric>组成 - for_each:起始迭代器,终止迭代器,仿函数 - ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> using namespace std; void print01(int val){ cout<<val<<" "; } class print{ public: void operator()(int val){ cout<<val<<" "; } }; void test01(){ vector<int> v; v.push_back(1); v.push_back(2); v.push_back(4); v.push_back(5); v.push_back(3); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } cout<<endl; for_each(v.begin(),v.end(),print01); cout<<endl; for_each(v.begin(),v.end(),print()); } int main(){ test01(); return 0; } ``` transform: - transform(iterator beg1,iterator end1, iterator beg2,func); - ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> using namespace std; class Transform{ public: int operator()(int v){ return v; } }; class Myprint{ public: void operator()(int val){ cout<<val<<" "; } }; void test01(){ vector<int> v; v.push_back(1); v.push_back(2); v.push_back(4); v.push_back(5); v.push_back(3); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } cout<<endl; vector<int>v2; v2.resize(v.size()); transform(v.begin(),v.end(),v2.begin(),Transform()); for_each(v2.begin(),v2.end(),Myprint()); } int main(){ test01(); return 0; } ``` 查找算法: - find();//查找元素 - find_if();//按照条件查找 - adjacent_find();//查找相邻重复元素 - binary_find();//二分查找算法 - count();//统计元素个数 - count_if();//按条件统计个数 - ```c+++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> using namespace std; class Person{ public: string name; int age; Person(string name, int age){ this->age =age; this->name = name; } bool operator==(const Person& p){ if(this->name==p.name && this->age==p.age){ return true; }else{ return false; } } }; void test01(){ vector<int> v; v.push_back(1); v.push_back(2); v.push_back(4); v.push_back(5); v.push_back(3); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } vector<int> ::iterator it = find(v.begin(),v.end(),5); if(it!=v.end()){ cout<<"找到了"<<endl; }else{ cout<<"未找到"<<endl; } } void test02(){ vector<Person> v; Person p1("aa",11); v.push_back(p1); Person p2("bb",121); v.push_back(p2); Person p3("cc",111); v.push_back(p3); Person bb("bb",121); vector<Person>::iterator it =find(v.begin(),v.end(),bb); if(it!=v.end()){ cout<<"找到了"<<endl; }else{ cout<<"未找到"<<endl; } } int main(){ test02(); return 0; } ``` find_if查找算法: ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> using namespace std; class Person{ public: string name; int age; Person(string name, int age){ this->age =age; this->name = name; } bool operator==(const Person& p){ if(this->name==p.name && this->age==p.age){ return true; }else{ return false; } } }; class mygreater{ public: bool operator()(int val){ return val>5; } }; class Greater20{ public: bool operator()(Person&p){ return p.age>20; } }; void test01(){ vector<int> v; v.push_back(1); v.push_back(2); v.push_back(4); v.push_back(5); v.push_back(3); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } cout<<endl; vector<int> ::iterator it = find_if(v.begin(),v.end(),mygreater()); if(it!=v.end()){ cout<<"找到了"<<endl; }else{ cout<<"未找到"<<endl; } } void test02(){ vector<Person> v; Person p1("aa",11); v.push_back(p1); Person p2("bb",121); v.push_back(p2); Person p3("cc",111); v.push_back(p3); Person bb("bb",121); vector<Person>::iterator it =find_if(v.begin(),v.end(),Greater20()); if(it!=v.end()){ cout<<"找到了"<<endl; }else{ cout<<"未找到"<<endl; } } int main(){ test02(); return 0; } ``` adjacent_find: - 函数原型:adjacent_find(iterator beg,iterator end); - ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> using namespace std; void test01(){ vector<int> v; v.push_back(1); v.push_back(5); v.push_back(4); v.push_back(2); v.push_back(2); v.push_back(3); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } cout<<endl; vector<int> ::iterator it = adjacent_find(v.begin(),v.end()); if(it!=v.end()){ cout<<"找到了"<<endl; }else{ cout<<"未找到"<<endl; } } int main(){ test01(); return 0; } ``` binary_search: - 有序序列(前提要记住) - bool binary_search(iterator beg, iterator end ,val); - ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> using namespace std; void test01(){ vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(6); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } cout<<endl; bool flag = binary_search(v.begin(),v.end(),3); if(flag){ cout<<"找到了"<<endl; }else{ cout<<"未找到"<<endl; } } int main(){ test01(); return 0; } ``` count: - count(iterator beg,iterator end,value); - ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> using namespace std; class Person{ public: string name; int age; Person(string name, int age){ this->age =age; this->name = name; } bool operator==(const Person& p){ if(this->name==p.name && this->age==p.age){ return true; }else{ return false; } } }; void test01(){ vector<int> v; v.push_back(1); v.push_back(2); v.push_back(4); v.push_back(5); v.push_back(3); v.push_back(2); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } cout<<endl; int nums = count(v.begin(),v.end(),2); cout<<"nums为2的个数为:"<<nums<<endl; } void test02(){ vector<Person> v; Person p1("aa",11); v.push_back(p1); Person p2("bb",121); v.push_back(p2); Person p3("cc",111); v.push_back(p3); Person bb("bb",121); int nums =count(v.begin(),v.end(),bb); cout<<"nums为2的个数为:"<<nums<<endl; } int main(){ test02(); return 0; } ``` count_if: - count_if(iterator beg,iterator end,_pred); - _perd表示的谓词 - ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> using namespace std; class Person{ public: string name; int age; Person(string name, int age){ this->age =age; this->name = name; } }; class mygreater{ public: bool operator()(int val){ return val>2; } }; class Greater100{ public: bool operator()(Person&p){ return p.age>100; } }; void test01(){ vector<int> v; v.push_back(1); v.push_back(2); v.push_back(4); v.push_back(5); v.push_back(3); v.push_back(2); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } cout<<endl; int nums = count_if(v.begin(),v.end(),mygreater()); cout<<"nums为2的个数为:"<<nums<<endl; } void test02(){ vector<Person> v; Person p1("aa",11); v.push_back(p1); Person p2("bb",101); v.push_back(p2); Person p3("cc",100); v.push_back(p3); Person bb("bb",121); v.push_back(bb); int nums =count_if(v.begin(),v.end(),Greater100()); cout<<"nums为年龄大于100的人个数为:"<<nums<<endl; } int main(){ test02(); return 0; } ``` - 常用排序算法: - - sort() - random_shuffle - merge - reverse sort(beg,end,_pred); random_shuffle: ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> #include<ctime> using namespace std; void test01(){ vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(6); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } //随机数种子 srand((unsigned int)time(NULL)); random_shuffle(v.begin(),v.end()); cout<<endl; for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } } int main(){ test01(); return 0; } ``` merge(v.begin(),v.end(),v1.begin(),v1.end(),vtarget.begin()); merge合并两个容器必须是有序的序列 reverse(beg,end); ##### 常用的拷贝和替换算法 - copy - replace - swap - copy(beg,end,iterator target); - ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> #include<ctime> using namespace std; void test01(){ vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(6); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } cout<<endl; vector<int> v2; v2.resize(v.size()); copy(v.begin(),v.end(),v2.begin()); for(vector<int>::iterator it=v2.begin();it!=v2.end();it++){ cout<<*it<<" "; } } int main(){ test01(); return 0; } ``` replace:replace(beg,end,oldvalue,newValue); replace_if(beg,end,_pred);//_pred为谓词 swap(container c1, container c2); ```c++ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<functional> #include<ctime> using namespace std; void test01(){ vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(6); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } vector<int>v2; v2.push_back(5); v2.push_back(4); v2.push_back(6); v2.push_back(7); v2.push_back(2); v2.push_back(1); swap(v,v2); cout<<endl; for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } } int main(){ test01(); return 0; } ``` 常用的算术生成算法: - ```c+++ #include<iostream> #include<string> #include<vector> #include<numeric> using namespace std; void test01(){ vector<int> v; for(int i=0;i<=100;i++){ v.push_back(i); } //参数三是起始累加的值 int total = accumulate(v.begin(),v.end(),0); for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout<<*it<<" "; } cout<<endl; cout<<"total="<<total <<endl; } int main(){ test01(); return 0; } ``` - fill(beg,end,value); - set_intersection;//两个容器交集 - set_union;//两个容器并集 - set_difference;//两个容器的差集 - ```c++ #include<iostream> #include<string> #include<vector> #include<numeric> #include<algorithm> using namespace std; void print(int val){ cout<<val<<" "; } void test01(){ vector<int> v1; for(int i=0;i<=10;i++){ v1.push_back(i); } vector<int> v2; for(int i=0;i<=10;i++){ v2.push_back(i+5); } vector<int>target; target.resize(min(v1.size(),v2.size())); vector<int>::iterator it = set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),target.begin()); //末尾的迭代器传入得到后的迭代器it; for_each(target.begin(),it,print); cout<<endl; } int main(){ test01(); return 0; } ``` - ```c++ #include<iostream> #include<string> #include<vector> #include<numeric> #include<algorithm> using namespace std; void print(int val){ cout<<val<<" "; } void test02(){ vector<int> v1; for(int i=0;i<=10;i++){ v1.push_back(i); } vector<int> v2; for(int i=0;i<=10;i++){ v2.push_back(i+5); } vector<int>target; target.resize(v1.size()+v2.size()); vector<int>::iterator it = set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),target.begin()); //末尾的迭代器传入得到后的迭代器it; for_each(target.begin(),it,print); cout<<endl; } int main(){ test02(); return 0; } ``` - ```c++ #include<iostream> #include<string> #include<vector> #include<numeric> #include<algorithm> using namespace std; void print(int val){ cout<<val<<" "; } void test03(){ vector<int> v1; for(int i=0;i<=10;i++){ v1.push_back(i); } for_each(v1.begin(),v1.end(),print); cout<<endl; vector<int> v2; for(int i=0;i<=10;i++){ v2.push_back(i+5); } for_each(v2.begin(),v2.end(),print); cout<<endl; vector<int>target; target.resize(max(v1.size(),v2.size())); vector<int>::iterator it = set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),target.begin()); //末尾的迭代器传入得到后的迭代器it; for_each(target.begin(),it,print); cout<<endl; } int main(){ test03(); return 0; } ``` -
{{ item.content }}
{{ child.content }}