simstr 1.0
Yet another strings library
 
Загрузка...
Поиск...
Не найдено
Шаблон структуры simstr::expr_replace_symbols< K, UseVectorForReplace >

Тип для строкового выражения, генерирующее строку, в которой заданные символы заменяются на заданные строки. Подробнее...

#include <sstring.h>

Открытые члены

constexpr expr_replace_symbols (simple_str< K > source, const std::vector< std::pair< K, simple_str< K > > > &repl)
 Конструктор выражения
 

Подробное описание

template<typename K, bool UseVectorForReplace = false>
struct simstr::expr_replace_symbols< K, UseVectorForReplace >

Тип для строкового выражения, генерирующее строку, в которой заданные символы заменяются на заданные строки.

Параметры шаблона
K- тип символа
UseVectorForReplace- использовать вектор для запоминания результатов поиска вхождений символов

Этот тип применяется, когда состав символов или соответствующих им замен не известен в compile time, а определяется в runtime. В конструктор передается вектор из пар символ - строка замены. Параметр UseVectorForReplace задаёт стратегию реализации. Дело в том, что работа любых строковых выражений разбита на две фазы - вызов length(), в котором подсчитывется количество символов в результате, и вызов place(), в котором результат помещается в предоставленный буфер. При UseVectorForReplace == true во время фазы подcчёта количества символов, позиции найденных вхождений сохраняются в векторе, и во время второй фазы поиск уже не выполняется, а позиции берутся из вектора. Это, с одной стороны, уменьшает время во второй фазе - не нужно снова выполнять поиск, но увеличивает время в первой фазе - добавление элементов в вектор не бесплатно, и требует времени. При UseVectorForReplace == false во время фазы подcчёта количества символов, в локальном массиве запоминается позиции первых 16 вхождений и их общее количество, а во время второй фазы, если вхождений больше 16, то поиск повторяется, но уже только с позиции 16го вхождения. Это может увеличить время во второй фазе, но сокращает время в первой фазе - не нужно добавлять элементы в вектор, не нужна динамическая аллокация. В разных сценариях использования более оптимальными могут быть та или иная стратегия, и вы можете сами решить, что в каждом конкретном случае больше подойдёт.

Конструктор(ы)

◆ expr_replace_symbols()

template<typename K, bool UseVectorForReplace = false>
simstr::expr_replace_symbols< K, UseVectorForReplace >::expr_replace_symbols ( simple_str< K > source,
const std::vector< std::pair< K, simple_str< K > > > & repl )
inlineconstexpr

Конструктор выражения

Аргументы
source- исходная строка
repl- вектор из пар "символ->строка замены".

Пример:

stringa result = expr_replace_symbols<u8s, true>{source, {
{'-', ""},
{'<', "&lt;"},
{'>', "&gt;"},
{'\'', "&#39;"},
{'\"', "&quot;"},
{'&', "&amp;"},
}};
constexpr expr_replace_symbols(simple_str< K > source, const std::vector< std::pair< K, simple_str< K > > > &repl)
Конструктор выражения
Определения sstring.h:5032

Пример приведен для наглядности использования. В данном случае и заменяемые символы, и строки замены известны в compile time, и в этом случае лучше применять e_repl_const_symbols, а этот класс используется, когда символы или замены задаются в runtime.


Объявления и описания членов структуры находятся в файле: