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

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

#include <strexpr.h>

Граф наследования:simstr::expr_replace_symbols< K, UseVectorForReplace >:
simstr::expr_to_std_string< expr_replace_symbols< K, false > >

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

constexpr expr_replace_symbols (str_t source, const std::vector< std::pair< K, str_t > > &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 ( str_t source,
const std::vector< std::pair< K, str_t > > & repl )
inlineconstexpr

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

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

Пример:

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

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


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