Существуют шаблоны проектирования, которые покрывают потребность в сложной конструкции - если это невозможно сделать лаконично, создайте фабричный метод или фабричный класс.
С последней версией java и добавлением lambdas, легко создать конструктор, который может принять любой желаемый код инициализации.
class LambdaInitedClass {
public LamdaInitedClass(Consumer<LambdaInitedClass> init) {
init.accept(this);
}
}
Вызовите его с помощью ...
new LambdaInitedClass(l -> { // init l any way you want });
std :: string
не содержит такой функции, но вы можете использовать автономную функцию replace
из заголовка алгоритма
.
#include <algorithm>
#include <string>
void some_func() {
std::string s = "example string";
std::replace( s.begin(), s.end(), 'x', 'y'); // replace all 'x' to 'y'
}
Что относительно Спускаются на веревке StrReplaceAll? От заголовочного файла:
// This file defines `absl::StrReplaceAll()`, a general-purpose string
// replacement function designed for large, arbitrary text substitutions,
// especially on strings which you are receiving from some other system for
// further processing (e.g. processing regular expressions, escaping HTML
// entities, etc.). `StrReplaceAll` is designed to be efficient even when only
// one substitution is being performed, or when substitution is rare.
//
// If the string being modified is known at compile-time, and the substitutions
// vary, `absl::Substitute()` may be a better choice.
//
// Example:
//
// std::string html_escaped = absl::StrReplaceAll(user_input, {
// {"&", "&"},
// {"<", "<"},
// {">", ">"},
// {"\"", """},
// {"'", "'"}});
Как предложил Кирилл, либо используйте метод replace, либо выполняйте итерацию по строке, заменяя каждый символ независимо.
В качестве альтернативы вы можете использовать метод find
или find_first_of
в зависимости от того, что вам нужно сделать. Ни одно из этих решений не сработает за один раз, но с помощью нескольких дополнительных строк кода вы должны заставить их работать на вас. : -)
Простой поиск и замена одного символа будет выглядеть примерно так:
s.replace (s.find ("x"), 1, "y")
To сделайте это для всей строки, проще всего будет выполнить цикл до тех пор, пока ваш s.find
не начнет возвращать npos
. Я полагаю, вы также можете поймать range_error
, чтобы выйти из цикла, но это некрасиво.