Этот пример преобразует полосу 1 в верхние и тримовые пространства с начала и конца строки. Затем стр2 создается как копия стр1 с «приветом» заменена на «прощай». Этот пример демонстрирует несколько важных понятий, используемых в библиотеке:
Параметры контейнера: В отличие от алгоритмов STL, параметры не указаны только в виде итераторов. Конвенция STL допускает большую гибкость, но имеет несколько ограничений. Невозможно stack алгоритмы вместе, потому что контейнер передается по двум параметрам. Поэтому использовать обратное значение от другого алгоритма невозможно. Гораздо проще написать to_lower(str1), чем to_lower(str1.begin(), str1.end().
Волшебство Boost.Range обеспечивает единообразный способ обработки различных типов строк. Если есть необходимость пройти пару итераторов, boost::iterator_range может быть использован для упаковки итераторов в структуру с совместимым интерфейсом.
Копи против Mutable: Многие алгоритмы в библиотеке осуществляют трансформацию ввода. Преобразование может быть осуществлено в месте, мутируя последовательность ввода, или может быть создана копия преобразованного ввода, оставляя вход нетронутым. Ни одна из этих возможностей не превосходит другую, и оба имеют разные преимущества и недостатки. По этой причине оба поставляются в библиотеку.
Algorithm штабелирование: Копировать версии возвращают преобразованный вход в результате, таким образом, позволяют простую цепь трансформаций в одном выражении (т.е. можно написать trim_copy(to_upper_copy(s))). Мубильные версии имеют возврат void, чтобы избежать неправильного использования.
Наминг: Наименование следует конвенциям из библиотеки Standard C++. Если есть копия и слизистая версия одного и того же алгоритма, то мюбильная версия не имеет суффикса, а копия имеет suffix _copy. Некоторые алгоритмы имеют префикс i (например, ifind_first()). Этот префикс определяет, что алгоритм работает в нечувствительной для случая манере.
Часть библиотеки имеет дело с кондикатами, связанными с строками. Рассмотрим этот пример:
bool is_executable( string& filename )
{
return
iends_with(filename, ".exe") ||
iends_with(filename, ".com");
}
// ...
string str1("command.com");
cout
<< str1
<< (is_executable(str1)? "is": "is not")
<< "an executable"
<< endl; // prints "command.com is an executable"
//..
char text1[]="hello";
cout
<< text1
<< (all( text1, is_lower() )? " is": " is not")
<< " written in the lower case"
<< endl; // prints "hello is written in the lower case"
Предикаты определяют, содержится ли подстровка в строке ввода в различных условиях. Условия: строка начинается с подстроя, заканчивается подстроем, просто содержит подкрепку или если обе строки равны. Дополнительные подробности см. в ссылке boost/algorithm/string/predicate.hpp.
Обратите внимание, что если бы мы использовали "hello world" в качестве входа в тест, он имел бы вывод "hello world не написан в нижнем случае", потому что пространство в строке ввода не является буквой нижнего корпуса.
Кроме того, алгоритм all() проверяет все элементы контейнера, чтобы удовлетворить условие, указанное предикатом. Этот предикат может быть любым неарочным предикатом, но библиотека предоставляет кучу полезных кондитерских и комбинаторов, готовых к использованию. Они расположены в boost/algorithm/string/classification.hpp заголовок. Классификационные предикаты могут быть объединены с использованием логических комбинаторов для формирования более сложных выражений. Например: is_from_range('a','z') || is_digit()
Trimming
При анализе ввода от пользователя, строки часто имеют нежелательные ведущие или следящие символы. Чтобы избавиться от них, нам нужны мелочные функции:
Можно обрезать пространства справа, слева или по обе стороны струны. А для тех случаев, когда есть необходимость удалить что-то другое, чем пустое пространство, есть варианты _if. Используя их, пользователь может указать фанктор, который выберет пространство для удаления. Можно использовать классификационные предикаты, такие как is_digit(), упомянутые в предыдущем пункте. См. ссылку на boost/algorithm/string/trim.hpp.
Find algorithms
Библиотека содержит набор алгоритмов поиска. Вот пример:
char text[]="hello dolly!";
iterator_range<char*> result=find_last(text,"ll");
transform( result.begin(), result.end(), result.begin(), bind2nd(plus<char>(), 1) );
// text = "hello dommy!"
to_upper(result); // text == "hello doMMy!"
// iterator_range is convertible to bool
if(find_first(text, "dolly"))
{
cout << "Dolly is there" << endl;
}
Мы использовали find_last() для поиска text для "ll". Результат дается в boost::iterator_range. Этот диапазон делит часть ввода, которая удовлетворяет критериям поиска. В нашем примере это последнее появление «ll». Как мы видим, вход find_last() алгоритм может быть также char[], потому что этот тип поддерживается Boost.Range. Следующие линии преобразуют результат. Обратите внимание, что boost::iterator_range имеет знакомые методы begin() и end(), поэтому его можно использовать как любой другой контейнер STL. Кроме того, он конвертируемый, чтобы обмануть, поэтому легко использовать алгоритмы поиска для простой проверки удержания.
Поиск алгоритмов может быть использован для поиска определенной части строки. Замена идет еще на один шаг. После того, как найдена соответствующая часть, она заменяется чем-то другим. Замена вычисляется из оригинала, используя некоторую трансформацию.
Полный список функций замены и удаления см. в разделе reference. Существует множество предопределенных функций для общего использования, однако библиотека позволяет определить пользовательский замен (), который соответствует конкретной потребности. Существует общая функция find_format(), которая занимает два параметра. Первый - объект Finder, второй - объект Formatter. Объект Finder - это фанктор, который выполняет поиск заменяющей части. Объект Форматтера принимает результат поиска (как правило, ссылка на найденное подстрое) и создает его замену. Замена алгоритма объединяет эти два и делает желаемую замену.
Расширение, чтобы найти алгоритмы это Итератор Поиска. Вместо поиска только одной части строки, поисковый итератор позволяет нам итерировать через подстрочки, соответствующие указанным критериям. Этот объект использует Finder для постепенного поиска строки. Dereferencing a find iterator yields an boost::iterator_range object, that delimits the current match.
Есть два итератора, предоставленные find_iterator и split_iterator. Бывшая итерирует над подстроями, которые обнаруживаются с использованием указанного Поиска. Последние изменяют пробелы между этими подстроками.
Обратите внимание, что итераторы поиска имеют только один параметр шаблона. Это тип базового итератора. Нахождение указывается в момент запуска. Это позволяет набрать итератор поиска для общих типов строк и повторно использовать его. Кроме того, функции makeiterator помогают построить поисковый итератор для определенного диапазона.
Алгоритмы разделения - это расширение поискового итератора для одного общего сценария использования. Эти алгоритмы используют поисковый итератор и хранят все спички в предоставленном контейнере. Этот контейнер должен иметь возможность хранить копии (например, std::string) или ссылки (например, iterator_range) извлеченных подступов.
Предоставляются два алгоритма. find_all() находит все копии строки в вводе. split() разделяет вход на части.
[hello] обозначает iterator_range делимитация этого подстроя.
Первый пример показывает, как построить контейнер, чтобы иметь ссылки на все извлеченные подстрои. Алгоритм ifind_all() помещает в FindVec ссылки на все подстрои, которые в случае-нечувствительным образом равны «abc».
Второй пример использует split(), чтобы разделить строку 1 на части, разделенные символами '-' или '*'. Эти части затем помещаются в SplitVec. Можно указать, конкатенируются или нет соседние сепараторы.
Статья Usage раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 2. Boost String Algorithms Library может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.