Если вы не хотите делать два цикла, потому что вы измерили и обнаружили, что он медленнее , напишите собственный алгоритм:
template <typename Iter, typename OutIter>
OutIter lowercased_without_punctuation(Iter begin, Iter end, OutIter out) {
while (begin != end) {
// Ignoring things like std::move_iterator for brevity.
if (!is_punctuation(*begin)) {
*out = tolower(*begin);
++out;
}
// Use `++iter` rather than `iter++` when possible
++begin;
}
return out;
}
// ...
string encipher(string text) {
Alphabet a;
encipheredAlphabet = a.cipherLetters(keyword);
text.erase(
lowercased_without_punctuation(text.begin(), text.end(), text.begin()),
text.end());
return text;
}
Если вы подумаете об этом,более того, lowercased_without_punctuation
на самом деле является частным случаем более общего алгоритма, который можно назвать transform_if
( соответствующие вопросы и ответы ):
template <typename Iter, typename OutIter, typename Pred, typename Transf>
OutIter transform_if(Iter begin, Iter end, OutIter out, Pred p, Transf t) {
while (begin != end) {
if (p(*begin)) {
*out = t(*begin);
++out;
}
++begin;
}
return out;
}
// ...
string encipher(string text) {
Alphabet a;
encipheredAlphabet = a.cipherLetters(keyword);
text.erase(
transform_if(text.begin(), text.end(), text.begin(),
[](char c) { return !is_punctuation(c); },
[](char c) { return tolower(c); }),
text.end());
return text;
}