Как эффективный способ заменить все вхождения персонажа другим персонажем std::string
?
c++
algorithm
str-replace
stdstring
большой г
источник
источник
std::string
представляет собой контейнер , специально предназначенный для работы с последовательностями символов. ссылкаstd::string::replace()
вместоstd::replace()
! 'x' (char
) косвенно приводится кsize_t
[значению 120], поэтому вся строка или ее часть будет заполнена 120 копиями y.Я думал, что я также добавлю решение для повышения :
источник
-I
флагов для вашего компилятора, чтобы он мог найти библиотеки Boost в вашей системе. Возможно, вам даже нужно сначала установить его.Вопрос сосредоточен на
character
замене, но, поскольку я нашел эту страницу очень полезной (особенно замечание Конрада ), я хотел бы поделиться этой более обобщенной реализацией, которая также позволяет иметь дело сsubstrings
:Применение:
Выходы:
РЕДАКТИРОВАТЬ:
Вышеприведенное может быть реализовано более подходящим способом, в случае, если производительность вас интересует, ничего не возвращая (
void
) и выполняя изменения непосредственно в строке,str
заданной в качестве аргумента, передаваемой по адресу, а не по значению . Это позволило бы избежать бесполезного и дорогостоящего копирования исходной строки при возврате результата. Твой звонок, тогда ...Код:
Надеюсь, что это будет полезно для некоторых других ...
источник
from
строка пустой, иначе произойдет бесконечный цикл.Представьте большой двоичный двоичный объект, в котором все байты 0x00 должны быть заменены на «\ 1 \ x30», а все байты 0x01 - на «\ 1 \ x31», поскольку транспортный протокол не допускает байтов \ 0.
В случаях, когда:
предоставленные решения не могут быть применены (потому что они заменяют только отдельные символы) или имеют проблемы с производительностью, потому что они будут вызывать string :: replace несколько раз, что будет генерировать копии размера большого двоичного объекта снова и снова. (Я не знаю, решение для повышения, может быть, это нормально с этой точки зрения)
Этот шаг проходит по всем вхождениям в исходной строке и строит новую строку по частям один раз :
источник
Простой поиск и замена для одного символа будет выглядеть примерно так:
s.replace(s.find("x"), 1, "y")
Чтобы сделать это для всей строки, проще всего сделать цикл до тех пор, пока не
s.find
начнется возвратnpos
. Я полагаю, вы также можете поймать,range_error
чтобы выйти из цикла, но это довольно уродливо.источник
{
персонаж. Я не знаю, что такое "двойная скобка". Возможно, у вас есть какая-то проблема со шрифтом?Если вы хотите заменить более одного символа и имеете дело только с этим
std::string
, этот фрагмент будет работать, заменив sNeedle в sHaystack на sReplace, а sNeedle и sReplace не обязательно должны быть одинакового размера. Эта процедура использует цикл while для замены всех вхождений, а не только первый найденный слева направо.источник
find
звонок дважды. Попробуйте сделать этот результат временной переменной.Как предложил Кирилл, либо используйте метод replace, либо итерируйте по строке, заменяя каждый символ независимо.
В качестве альтернативы вы можете использовать
find
метод или вfind_first_of
зависимости от того, что вам нужно сделать. Ни одно из этих решений не выполнит работу за один раз, но с несколькими дополнительными строками кода вы должны заставить их работать на вас. :-)источник
источник
word
long, то при вызове функции может возникнуть много накладных расходов. Вы можете оптимизировать это путем передачиword
,target
и вreplacement
качестве константных ссылок.Как насчет Abseil StrReplaceAll ? Из заголовочного файла:
источник
Старая школа :-)
Результат:
источник
Это работает! Я использовал нечто похожее на это для приложения книжного магазина, где инвентарь хранился в CSV (например, в файле .dat). Но в случае с одним символом, то есть заменяющим является только один символ, например '|', он должен быть в двойных кавычках "|" чтобы не скинуть недопустимую конверсию const char.
К сожалению, в настоящее время я использую CentOS, поэтому моя версия компилятора приведена ниже. Версия C ++ (g ++), C ++ 98 по умолчанию:
источник
Если вы хотите использовать
std::string
s, вы можете использоватьstrsub
функцию этого примера приложения как есть или обновить ее, если хотите, чтобы она принимала другой тип или набор параметров для достижения примерно той же цели. По сути, он использует свойства и функциональные возможности,std::string
чтобы быстро удалить соответствующий набор символов и вставить нужные символы непосредственно вstd::string
. Каждый раз, когда он выполняет эту операцию замены, смещение обновляется, если он все еще может найти совпадающие символы для замены, и, если он не может заменить ничего, он возвращает строку в своем состоянии из последнего обновления.Если вы не хотите полагаться на использование
std::string
s в качестве параметров, чтобы вместо этого можно было передавать строки в стиле C, вы можете увидеть обновленный пример ниже:источник
Для простых ситуаций это работает довольно хорошо, без использования какой-либо другой библиотеки, кроме std :: string (которая уже используется).
Замените все вхождения символа a символом b в some_string :
Если строка большая или несколько вызовов для замены является проблемой, вы можете применить метод, упомянутый в этом ответе: https://stackoverflow.com/a/29752943/3622300
источник
Вот решение, которое я выбрал, в духе максимального DRI. он будет искать sNeedle в sHaystack и заменять его на sReplace, nTimes, если не равно 0, иначе все вхождения sNeedle. он не будет искать снова в замененном тексте.
источник