Первая из этих двух реализаций неверна. Функция string::reserve
не меняет размер строки; скорее он просто выделяет внутреннее буферное пространство для него. Это означает, что если вы начинаете писать в строку, вы перезаписываете символы, которые являются физически частью строки, но не логически частью строки. То есть символы есть, но длина строки не будет указывать их как часть строки.
Однако я понимаю, почему вы пытаетесь использовать reserve
таким образом: если вы используете resize
, чтобы увеличить строку, то всем символам нужно будет присвоить какое-то значение, и это может внести некоторую неэффективность в программу. Поэтому вы ищете способ избежать этой стоимости. Если вы хотите сделать это, рассмотрите возможность использования следующего кода:
string ToUpper(const std::string& source) {
std::string result;
result.reserve(source.length());
for (string::const_iterator itr = source.begin(); itr != source.end(); ++itr)
result += std::toupper(*itr);
return result;
}
Сначала вызывается reserve
в строке результата, чтобы предварительно выделить для нее место для хранения. Затем мы просто пройдемся по элементам первой строки, преобразовав каждый из них в верхний регистр и добавив его к результирующей строке, используя operator +=
. Поскольку в строке уже существует пробел из-за вызова reserve
, новых выделений не должно быть, и в буфер будут записываться только те символы, которые вам нужны.
Надеюсь, это поможет!