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 this FAQ
      entry) but the regular copy constructor cannot be used
      because libstdc++'s string is Copy-On-Write.