C++11学习:流操作和lambda处理字符串

C++11学习:流操作和lambda处理字符串最近学习C++11,发现变化真是很大,新特性特别多,库也得到了空前的提升。set vowel {‘a’, ‘e’

大家好,欢迎来到IT知识分享网。

最近学习C++11,发现变化真是很大,新特性特别多,库也得到了空前的提升。版本迭代特别快,最新的20版就要出来了。

字符串操作是程序中最基本的操作,Java/Python等语言在语法和库上都有较强的支撑。C++11对此进行了强化,另外增加的lambda、tuple、regex、thread等使得整个功能有了质的飞跃。真的是需要从基础重新学起,不断练习。

尝试练手的3个题目,写的并不是特别好

1、翻转单词顺序

C++11学习:流操作和lambda处理字符串

将字符串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、山羊拉丁文

C++11学习:流操作和lambda处理字符串

使用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、重新排列句子中的单词

C++11学习:流操作和lambda处理字符串

使用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://yundeesoft.com/61222.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信