From GCC 3.4 calling s.reserve(res) on a
string s with res < s.capacity() will
reduce the string's capacity to std::max(s.size(), res).
This behaviour is suggested, but not required by the standard. Prior to GCC 3.4 the following alternative can be used instead
std::string(str.data(), str.size()).swap(str);
This is similar to the idiom for reducing a vector's
memory usage (see FAQ 5.9) but
the regular copy constructor cannot be used because libstdc++'s
string is Copy-On-Write.