find_if函数与partition函数的转换

时间:2022-11-23 18:57:50

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

使用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,);
return ;
}

使用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,);
return ;
}

运行结果:

dfdaaaa 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,);
return ;
}

运行结果:

aaa fdaa aaaaa aaaaaaa dfaaaaa dfdaaaa 

aaaaa aaaaaaa dfaaaaa dfdaaaa 

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