Каков предпочтительный способ удаления пробелов из строки в C ++? Я мог бы перебрать все символы и создать новую строку, но есть ли лучший способ?
222
Лучше всего использовать алгоритм 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;
}
erase
позже. Это вернет правильный результат.isspace
UB для всех наборов символов, кроме оригинального 7-битного ASCII. C99 §7.4 / 1. это не удивляет меня , что это было upvoted в размере 71 голосов , в настоящее время, несмотря на то , очень плохой совет.isspace
для всех символов, не входящих в ASCII, с практическим выбором подписи по умолчанию дляchar
. Таким образом, он имеет неопределенное поведение . Я повторяю это, потому что я подозреваю преднамеренную попытку заглушить этот факт в шуме.источник
<algorithm>
чтобы это работало.От gamedev
источник
::isspace
UB.Можете ли вы использовать Boost String Algo? http://www.boost.org/doc/libs/1_35_0/doc/html/string_algo/usage.html#id1290573
источник
remove_if(str.begin(), str.end(), isspace);
упоминал Мэтт Прайс. Я не знаю почему. На самом деле, все вспомогательные элементы, имеющие альтернативы STL, работают медленнее, чем соответствующие gcc (все, что я тестировал). Некоторые из них намного медленнее! (до 5 раз во вставках unordered_map) Возможно, это связано с кэшем ЦП общей среды или чем-то в этом роде.Для обрезки используйте алгоритмы повышения строки :
источник
Вы можете использовать это решение для удаления символа:
источник
Привет, ты можешь сделать что-то подобное. Эта функция удаляет все пробелы.
Я сделал еще одну функцию, которая удаляет все ненужные пробелы.
источник
используй это:
источник
Если вы хотите сделать это с помощью простого макроса, вот один:
Это предполагает, что вы сделали,
#include <string>
конечно.Назовите это так:
источник
Я использовал описанную ниже работу надолго - не уверен насчет ее сложности.
s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return (f==' '||s==' ');}),s.end());
когда вы хотите удалить персонажа
' '
и некоторые, например,-
использоватьs.erase(std::unique(s.begin(),s.end(),[](char s,char f){return ((f==' '||s==' ')||(f=='-'||s=='-'));}),s.end());
аналогично просто увеличьте
||
число символов, которое вы хотите удалить, не 1но, как уже упоминалось, идиома удаления стирания также выглядит хорошо.
источник
Этот код в основном берет строку и проходит через все символы в ней. Затем он проверяет, является ли эта строка пробелом, если нет, то символ добавляется в новую строку.
источник
Источник:
Ссылка взята с этого форума.
источник
В C ++ 20 вы можете использовать бесплатную функцию std :: erase
Полный пример:
Я печатаю | так что очевидно, что пространство в начале также удаляется.
примечание: при этом удаляется только пробел, а не все другие возможные символы, которые могут считаться пробелами, см. https://en.cppreference.com/w/cpp/string/byte/isspace
источник
Удаляет все пробельные символы, такие как символы табуляции и переноса строк (C ++ 11):
источник
выход: 2CF4323CB9DE
источник
источник
length()
возвращает, аsize_t
неint
.erase()
Посмотри, аsize_type
неint
. Функция, вероятно, завершится ошибкой, если встретятся два последовательных пробела, поскольку индекс всегда увеличивается. Если удаляется один пробел, цикл будет читать за пределами строки. Вы, вероятно, должны удалить этот ответ, так как он нуждается в большой помощи.Боюсь, это лучшее решение, которое я могу придумать. Но вы можете использовать reserve () для предварительного выделения минимально необходимой памяти заранее, чтобы немного ускорить процесс. В итоге вы получите новую строку, которая, вероятно, будет короче, но она займет тот же объем памяти, но вы избежите перераспределения.
РЕДАКТИРОВАТЬ: В зависимости от вашей ситуации, это может потребовать меньше накладных расходов, чем жонглирование символов вокруг.
Вам следует попробовать разные подходы и посмотреть, что лучше для вас: у вас могут вообще не быть проблем с производительностью.
источник