Лучше всего использовать алгоритм remove_ifи isspace:
remove_if(str.begin(), str.end(), isspace);
Теперь сам алгоритм не может изменить контейнер (только изменять значения), поэтому он фактически перемещает значения вокруг и возвращает указатель туда, где должен быть конец. Поэтому нам нужно вызвать string :: erase, чтобы фактически изменить длину контейнера:
str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
Следует также отметить, что remove_if сделает не более одной копии данных. Вот пример реализации:
template<typename T, typename P>
T remove_if(T beg, T end, P pred)
{
T dest = beg;
for (T itr = beg;itr != end; ++itr)
if (!pred(*itr))
*(dest++) = *itr;
return dest;
}