Заменить N формул на одну (интерполяция строк)

Возможно ли в C++ сделать такое преобразование строк как:

Пример:

От:

F = a && b && c;
H = p ^ 2 + w
K = H > 10 || e < 5;
J = F && !K;

Для того, чтобы:

J = (a && b && c) && !( (p ^ 2 + w) > 10 || e < 5);

1 ответ

Решение

Похоже, вы просите об интерполяции. В этом случае обязательно! Сначала вы захотите построить map<string, string> из ключей и значений, например:

map<string, string> interpolate = { { "F"s, "a && b && c"s }, { "H"s, "p ^ 2 + w"s }, { "K"s, "H > 10 || e < 5"s }, { "J"s, "F && !K"s } };

Тогда просто используйте for_each, stding::find, а также string::replace,

for(const auto& i : interpolate) for_each(begin(interpolate), end(interpolate), [&](auto& it){ for(auto pos = it.second.find(i.first); pos != string::npos; pos = it.second.find(i.first, pos)) it.second.replace(pos, i.first.size(), '(' + i.second + ')'); });

Живой пример

После запуска этого кода, при выводе interpolate с for(const auto& i : interpolate) cout << i.first << " : " << i.second << endl Ты получишь:

F: a && b && c
H: p ^ 2 + w
J: (a && b && c) &&! ((P ^ 2 + w)> 10 || e < 5)
K: (p ^ 2 + w)> 10 || е < 5

Другие вопросы по тегам