C++ Primer(第5版) 练习 10.19
练习 10.19 用stable_partition重写前一题的程序,与stable_sort类似,在划分后的序列中维持原有元素的顺序。
环境:Linux Ubuntu(云服务器)
工具:vim
代码块
cpp
/*************************************************************************
> File Name: ex10.19.cpp
> Author:
> Mail:
> Created Time: Sat 02 Mar 2024 08:24:29 PM CST
************************************************************************/
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
string make_plural(size_t ctr, string &word, const string &ending = "s"){
int size = word.size();
if(ctr <= 1){
return word;
}
else{
if(word[size-1] == 's' || word[size-1] == 'x' || (word[size-1] == 'h' &&
word[size-2] == 's') || (word[size-1] == 'h' && word[size-2] == 'c')){
return word + "e" + ending;
}
else if(word[size-1] == 'y' && (word[size-2] != 'a' && word[size-2] != 'e' &&
word[size-2] != 'i' && word[size-2] != 'o' && word[size-2] != 'u')){
word[size-1] = 'i';
return word + "e" + ending;
}
else if((word[size-3] != 'a' && word[size-3] != 'e' && word[size-3] != 'i' &&
word[size-3] != 'o' && word[size-3] != 'u') && (word[size-2] != 'a' &&
word[size-2] != 'e' && word[size-2] != 'i' && word[size-2] != 'o' && word[size-2] != 'u')){
if(word[size-1] == 'f'){
word[size-1] = 'v';
return word + ending;
}
else if(word[size-2] == 'f' && word[size-1] == 'e'){
word[size-2] = 'v';
return word + "e" + ending;
}
}
else{
return word + ending;
}
}
return word;
}
void elimDups(vector<string> &words){
sort(words.begin(), words.end());
auto end = unique(words.begin(), words.end());
words.erase(end, words.end());
}
void biggies(vector<string> &words, vector<string>::size_type len){
elimDups(words);
auto pos = stable_partition(words.begin(), words.end(), [len](const string &a){ return a.size() < len; });
auto count = words.end() - pos;
string str("word");
cout<<count<<" "<<make_plural(count, str, "s")<<" of length "<<len<<" or longer"<<endl;
for_each(pos, words.end(), [](const string &s){ cout<<s<<" "; });
cout<<endl;
}
int main(){
vector<string> words;
string str;
cout<<"Enter strings: ";
while(cin>>str){
words.push_back(str);
if(cin.get() == '\n'){
break;
}
}
biggies(words, 5);
return 0;
}