Open alexey-malov opened 4 years ago
>ExpandTemplate.exe input.txt output.txt мир хлеб
Можно воспользоваться structure bindings (фича из C++17) для разбиения пары отдельные фрагменты:
string resultStr;
int pos = 0;
for (auto& [startSubstring, stringToReplace] : substrings)
[ ] Лучше воспользоваться версией append, позволяющей добавить к строке часть другой строки. Это позволит избавиться от извлечения подстроки, приводящего к выделению памяти в куче.
[ ] Если предположить, что в шаблоне для поиска может быть много placeholder-ов, то лучше возвращать из SearchSubstrings не map<int, string>
, а нечто более компактное:
vector<tuple<size_t, string_view, string_view>>
. Причины:
Вам не нужна древовидная структура для поиска - обход выполняется последовательно
Данные в vector хранятся последовательно, что лучше для кэша процессора.
string_view не копирует строки, а лишь ссылается на ключи и значения, которые лежат себе преспокойно в params. Каждый string_view занимает 16 байт на 64-битной платформе. Правда, в структуру Bohr потребуется положить еще данные о строке-заменителе.
Если хотите хранить знаковый тип, размер которого совпадает с size_t - используйте ptrdiff_t