首页 > 代码库 > find_if函数与partition函数的转换

find_if函数与partition函数的转换

编写程序,求大于等于一个给定长度的单词有多少。我们还会修改输出,使程序只打印大于等于给定长度的单词。

使用find_if实现的代码如下:

#include<algorithm>#include<vector>#include<iostream>#include<string>using namespace std;void biggies(vector<string> &words,vector<string>::size_type sz){    sort(words.begin(),words.end());    auto end_unique=unique(words.begin(),words.end());    words.erase(end_unique,words.end());    stable_sort(words.begin(),words.end(),[](const string &s1,const string s2) {return s1.size()<s2.size();});    auto wc=find_if(words.begin(),words.end(),[sz](const string &s) { return s.size()>=sz;});    auto count=words.end()-wc;    cout<<count<<endl;    for_each(wc,words.end(),[](const string &s) {cout<<s<<" ";});    cout<<endl;}int main(){    vector<string> words={"aaaaa","aaaaaaa","dfdaaaa","fdaa","aaa","dfaaaaa"};    biggies(words,5);    return 0;}

使用partition代码的程序:

#include<algorithm>#include<vector>#include<iostream>#include<string>using namespace std;void biggies(vector<string> &words,vector<string>::size_type sz){    sort(words.begin(),words.end());    auto end_unique=unique(words.begin(),words.end());    words.erase(end_unique,words.end());    stable_sort(words.begin(),words.end(),[](const string &s1,const string s2) {return s1.size()<s2.size();});    auto wc=partition(words.begin(),words.end(),[sz](const string &s) { return s.size()>=sz;});    auto count=wc-words.begin();    cout<<count<<endl;    for_each(words.begin(),wc,[](const string &s) {cout<<s<<" ";});    cout<<endl;}int main(){    vector<string> words={"aaaaa","aaaaaaa","dfdaaaa","fdaa","aaa","dfaaaaa"};    biggies(words,5);    return 0;}

运行结果:

4dfdaaaa dfaaaaa aaaaa aaaaaaa 

 当使用stable_partition后程序:

#include<algorithm>#include<vector>#include<iostream>#include<string>using namespace std;void biggies(vector<string> &words,vector<string>::size_type sz){    sort(words.begin(),words.end());    auto end_unique=unique(words.begin(),words.end());    words.erase(end_unique,words.end());    stable_sort(words.begin(),words.end(),[](const string &s1,const string s2) {return s1.size()<s2.size();});    for_each(words.begin(),words.end(),[](const string &s) {cout<<s<<" ";});    cout<<endl;    auto wc=stable_partition(words.begin(),words.end(),[sz](const string &s) { return s.size()>=sz;});    auto count=wc-words.begin();    cout<<count<<endl;    for_each(words.begin(),wc,[](const string &s) {cout<<s<<" ";});    cout<<endl;}int main(){    vector<string> words={"aaaaa","aaaaaaa","dfdaaaa","fdaa","aaa","dfaaaaa"};    biggies(words,5);    return 0;}

运行结果:

aaa fdaa aaaaa aaaaaaa dfaaaaa dfdaaaa 4aaaaa aaaaaaa dfaaaaa dfdaaaa 

说明stable_partiton不改变字典顺序,是稳定的操作。