c – 如何使用STL算法找到分隔字符串中两个不同字母的最短星号序
我有一个像这样的字符串:
A * A **乙*** A ** 我对两个不同字母之间的星号序列感兴趣,特别是我需要找到最短的序列的长度.对于上面的字符串,答案当然是2:A ** B. 我可以使用传统的循环轻松解决这个问题,我习惯于这样的循环: const string s = "A*A**B***A**"; string::size_type last_letter=-1,min_seq_len=s.size(); for(int i = 0; i < s.size(); i++) { if(last_letter == -1 || s[i] == '*' || s[i] == s[last_letter]) { if(s[i] != '*') { last_letter = i; } } else { min_seq_len = min(min_seq_len,i-last_letter-1); last_letter = i; } } 但是,使用C algorithms library,迭代器等有没有办法做到这一点? 我问这个问题是因为我注意到我在学习如何使用这些工具来解决算法问题时遇到了麻烦,而是我发现手工编写循环更容易.我想最终学习C算法,范围,迭代器等操作. 解决方法
>你需要尽量减少一些事情.您可以使用std :: min_element. 然后,您需要在算法之间编写一些粘合剂,您可以隐藏在类似STL的接口后面.例: auto letter_pairs = letter_pair_generator(s); const auto min_seq_len = std::min_element( std::begin(letter_pairs),std::end(letter_pairs),[](const auto& x) { return x.asterisk_count(); }); 其中letter_pair_generator是std :: string上的一个适配器,它暴露了一个类似于容器的接口,该接口返回不同字母对,其间带有星号.例: string s = "A*A**B***A**"; for(const auto& p : letter_pair_generator(s)) cout << p;
有时循环比多次调用< algorithm>更清晰,更快.这没有什么本质上的错误.使用循环并将其包装成更安全/更好的界面. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |