Тип для строкового выражения, генерирующее строку, в которой заданные символы заменяются на заданные строки. Подробнее...
#include <sstring.h>
Открытые члены | |
constexpr | expr_replace_symbols (simple_str< K > source, const std::vector< std::pair< K, simple_str< K > > > &repl) |
Конструктор выражения | |
Тип для строкового выражения, генерирующее строку, в которой заданные символы заменяются на заданные строки.
K | - тип символа |
UseVectorForReplace | - использовать вектор для запоминания результатов поиска вхождений символов |
Этот тип применяется, когда состав символов или соответствующих им замен не известен в compile time, а определяется в runtime. В конструктор передается вектор из пар символ - строка замены
. Параметр UseVectorForReplace
задаёт стратегию реализации. Дело в том, что работа любых строковых выражений разбита на две фазы - вызов length()
, в котором подсчитывется количество символов в результате, и вызов place()
, в котором результат помещается в предоставленный буфер. При UseVectorForReplace == true
во время фазы подcчёта количества символов, позиции найденных вхождений сохраняются в векторе, и во время второй фазы поиск уже не выполняется, а позиции берутся из вектора. Это, с одной стороны, уменьшает время во второй фазе - не нужно снова выполнять поиск, но увеличивает время в первой фазе - добавление элементов в вектор не бесплатно, и требует времени. При UseVectorForReplace == false
во время фазы подcчёта количества символов, в локальном массиве запоминается позиции первых 16 вхождений и их общее количество, а во время второй фазы, если вхождений больше 16, то поиск повторяется, но уже только с позиции 16го вхождения. Это может увеличить время во второй фазе, но сокращает время в первой фазе - не нужно добавлять элементы в вектор, не нужна динамическая аллокация. В разных сценариях использования более оптимальными могут быть та или иная стратегия, и вы можете сами решить, что в каждом конкретном случае больше подойдёт.
|
inlineconstexpr |
Конструктор выражения
source | - исходная строка |
repl | - вектор из пар "символ->строка замены". |
Пример:
Пример приведен для наглядности использования. В данном случае и заменяемые символы, и строки замены известны в compile time, и в этом случае лучше применять e_repl_const_symbols, а этот класс используется, когда символы или замены задаются в runtime.