Удалить пробелы из std :: string в C ++

Каков предпочтительный способ удаления пробелов из строки в C ++? Я мог бы перебрать все символы и построить новую строку, но есть ли лучший способ?

c++,stl,

176

Ответов: 12


221 принят

Лучше всего использовать алгоритм 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;
}

std::string::iterator end_pos = std::remove(str.begin(), str.end(), ' ');
str.erase(end_pos, str.end());

От гамедева

string.erase(std::remove_if(string.begin(), string.end(), std::isspace), string.end());

Можете ли вы использовать Boost String Algo? http://www.boost.org/doc/libs/1_35_0/doc/html/string_algo/usage.html#id1290573

erase_all(str, " "); 

Для обрезки используйте алгоритмы форвардной строки :

#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost;

// ...

string str1(" hello world! ");
trim(str1);      // str1 == "hello world!"
C ++, STL,
Похожие вопросы
Яндекс.Метрика