Как прокомментировали Влад и Альф, std::string().swap(the_string)
- это способ C ++ 98 для освобождения емкости the_string
, а the_string.shrink_to_fit()
- это способ C ++ 11.
Относительно того, почему clear()
, erase()
, resize()
и т. Д. Не делают этого, это оптимизация для сокращения выделений, когда вы используете строку снова и снова. Если clear()
освободит емкость строки, вам, как правило, придется перераспределить аналогичный объем пространства на следующей итерации, что может занять некоторое время, которое реализация может сэкономить, сохранив емкость. Эта реализация не гарантируется стандартом, но она очень распространена в реализациях.
reserve()
задокументировано с
Вызов функции Reserve () с аргументом res_arg, меньшим емкости (), фактически является необязательным запросом сжатия. Вызов с res_arg <= size () по сути является необязательным запросом сжатия к размеру. </p>
, что означает, что реализации с большей вероятностью освободят емкость при вызове reserve()
. Если я правильно их читаю, libc ++ и libstdc ++ освобождают место при вызове reserve(0)
, но вполне вероятно, что библиотека VC ++ сделала противоположный выбор.
Редактировать: Как говорит Пенелопа, поведение std::string
здесь, как правило, точно такое же, как и поведение std::vector
.