Вторая версия очень неэффективна, поскольку вставка символа в начале длинной строки многократно означает, что все символы должны быть сдвинуты на одно место. Более того, res += s[i]
может использовать свободную емкость в буфере res
(строки увеличивают свой размер при превышении их емкости, так что повторная вставка в конце не требует перераспределения памяти каждый раз), тогда как res = s[i] + res
всегда выделяет новую строку и переместите строку в res
.
Вместо того, чтобы выкатывать свой собственный l oop и делать много ошибок (неправильный тип индекса, использование неоптимального оператора приращения / уменьшения, ошибка переноса ), используйте std::copy_if
(определено в заголовке <algorithm>
) вместе с std::back_inserter
(определено в заголовке <iterator>
):
std::string result;
std::copy_if(source.begin(), source.end(), std::back_inserter(result),
[](char c) {
return /* constraint */;
});
Вы также можете использовать reserve
, если вы знаете приблизительное количество символов, которые заранее удовлетворяют критерию.