Модификация string.replace

Иван Володин
Иван Володин

В .NET есть функция String.Replace, имеющая перегрузки String.Replace(char oldValue, char newValue) и String.Replace(string oldValue, string newValue) для замены в строке всех oldValue на newValue.

В C++ тоже есть похожая функция, string.replace(size_t start, size_t count, const string &str), однако она позволяет только заменить count символов строки с позиции start из другой переданной строки str.
Если есть необходимость замены во всей строке одного символа другим, или замены одной подстрокой другой, то придется использовать regex или писать самопальные функции.

Почему бы не расширить string.replace(size_t start, size_t count, const string &str) до string.replace(char oldValue, charnewValue) и string.replace(string oldValue, string newValue)?

11
рейтинг
4 комментария
raidenluikang

https://en.cppreference.com/w/cpp/string/basic_string/replace

 

пожалуйста не усложняйте std::string.replace )

raidenluikang
Евгений Тонишев

Есть же std::replace

 
Евгений Тонишев
Обновлено 
Kirill Frolov

std::replace() требует итераторов и предиката, кроме того работает с одним элементом, а не с последовательностью.

Здесь нужен цикл внутри которого производится поиск следующего вхождения подстроки в строку и последующая замена. Такой алгоритм будет неэффективен если замены производятся многократно в одной строке и напрашиваются другие решения...

Кроме того, возникает множество вопросов:

1) должна выполняться единственная замена или множественные?
2) если выполняется множественная замена, то поиск должен продолжаться со следующего символа или после заменённой подстроки?
3) возможно ли использование дополнительной памяти (копии строки) или желательно избегать реаллокации?

Я думаю, указанные вопросы -- это причина, почему такой функции нет в библиотеке. Её легко реализовать самостоятельно, но для библиотечной функции возникает слишком много тонкостей.

Kirill Frolov
Kirill Frolov

Я думаю, в библиотеке такая функция нужна, но как отдельная функция, а не перегрузка существующей функции, на которую в итоге окажется навешан существенно разный функционал.

 

Kirill Frolov
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения