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;
}

运行结果:

4
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,5);
    return 0;
}

运行结果:

aaa fdaa aaaaa aaaaaaa dfaaaaa dfdaaaa 
4
aaaaa aaaaaaa dfaaaaa dfdaaaa 

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

原文地址:https://www.cnblogs.com/wuchanming/p/3917708.html