大家好,欢迎来到IT知识分享网。
最近学习C++11,发现变化真是很大,新特性特别多,库也得到了空前的提升。版本迭代特别快,最新的20版就要出来了。
字符串操作是程序中最基本的操作,Java/Python等语言在语法和库上都有较强的支撑。C++11对此进行了强化,另外增加的lambda、tuple、regex、thread等使得整个功能有了质的飞跃。真的是需要从基础重新学起,不断练习。
尝试练手的3个题目,写的并不是特别好
1、翻转单词顺序
将字符串s关联到字符串流上,然后通过输入流迭代器(以空格为分割符)初始化vector,使用stl的反向拷贝函数将数据输出到输出流中。整个过程非常简洁。
string reverseWords(string s) {
stringstream ss{s};
vector<string> words((istream_iterator<string>(ss)), istream_iterator<string>());
ostringstream oss;
reverse_copy(begin(words), end(words), ostream_iterator<string>(oss,” “)); //reverse要求是双向迭代器
if(!oss.str().empty()) { //不完美,没有合理的包装
size_t len = oss.str().size();
return oss.str().substr(0, len – 1);
}
return oss.str();
}
如果要实现定制化的分割,可以将istream_iterator替换成sregex_iterator
2、山羊拉丁文
使用Lambda表达式处理元音字母
string toGoatLatin(string S) {
set<char> vowel {‘a’, ‘e’, ‘i’, ‘o’, ‘u’};
stringstream ss{S};
ostringstream oss;
int cnt = 1;
transform((istream_iterator<string>(ss)), istream_iterator<string>(), ostream_iterator<string>(oss,” “), [&](auto& word) {
string newWord;
if (vowel.count(tolower(word[0])) == 0) {
newWord = word.substr(1) + word.substr(0, 1);
}
else {
newWord = word;
}
newWord += “ma”;
for(int i = 1; i <= cnt; i++) newWord.push_back(‘a’);
cnt++;
return newWord;
});
if(!oss.str().empty()) {
size_t len = oss.str().size();
return oss.str().substr(0, len – 1);
}
return oss.str();
}
3、重新排列句子中的单词
使用tuple替代struct
string arrangeWords(string text) {
vector<tuple<string, int>> vec;
istringstream iss{text};
int index = 0;
transform(istream_iterator<string>(iss), {}, back_inserter(vec), [&](auto& word) {
if(index == 0) {
string w{word};
w[0] = tolower(w[0]);
return make_tuple(w, index++);
}
return make_tuple(word, index++);
});
sort(begin(vec), end(vec), [](auto& e1, auto& e2) {
if(get<0>(e1).size() > get<0>(e2).size()) return false;
if((get<0>(e1).size() == get<0>(e2).size()) && (get<1>(e1) > get<1>(e2))) return false;
return true;
});
ostringstream oss;
size_t cnt = vec.size();
transform(begin(vec), end(vec), ostream_iterator<string>(oss), [&](auto& e) {
cnt–;
if(cnt > 0) return get<0>(e) + ” “;
return get<0>(e);
});
string result { oss.str() };
if(!result.empty()) result[0] = toupper(result[0]);
return result;
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/61222.html