Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Usage

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 2. Boost String Algorithms Library

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Usage

First Example

Использование алгоритмов просто. Давайте рассмотрим первый пример:

    #include <boost/algorithm/string.hpp>
    using namespace std;
    using namespace boost;
    
    // ...
    string str1(" hello world! ");
    to_upper(str1);  // str1 == " HELLO WORLD! "
    trim(str1);      // str1 == "HELLO WORLD!"
    string str2=
       to_lower_copy(
          ireplace_first_copy(
             str1,"hello","goodbye")); // str2 == "goodbye world!"
        

Этот пример преобразует полосу 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()). Этот префикс определяет, что алгоритм работает в нечувствительной для случая манере.

Для использования библиотеки включите boost/algorithm/string.hpp заголовок. Если необходимы функции, связанные с regex, включают boost/algorithm/string_regex.hpp заголовок.

Case conversion

STL имеет хороший способ конвертировать случай персонажей. К сожалению, он работает только для одного персонажа, и мы хотим преобразовать строку,

    string str1("HeLlO WoRld!");
    to_upper(str1); // str1=="HELLO WORLD!"
        

to_upper() и to_lower() конвертировать случай символов в строку с использованием заданного лока.

Дополнительные сведения см. в ссылке boost/algorithm/string/case_conv.hpp.

Predicates and Classification

Часть библиотеки имеет дело с кондикатами, связанными с строками. Рассмотрим этот пример:

    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

При анализе ввода от пользователя, строки часто имеют нежелательные ведущие или следящие символы. Чтобы избавиться от них, нам нужны мелочные функции:

    string str1="     hello world!     ";
    string str2=trim_left_copy(str1);   // str2 == "hello world!     "
    string str3=trim_right_copy(str1);  // str3 == "     hello world!"
    trim(str1);                         // str1 == "hello world!"
    string phone="00423333444";
    // remove leading 0 from the phone number
    trim_left_if(phone,is_any_of("0")); // phone == "423333444"
        

Можно обрезать пространства справа, слева или по обе стороны струны. А для тех случаев, когда есть необходимость удалить что-то другое, чем пустое пространство, есть варианты _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. Кроме того, он конвертируемый, чтобы обмануть, поэтому легко использовать алгоритмы поиска для простой проверки удержания.

Поиск алгоритмов расположен в boost/algorithm/string/find.hpp.

Replace Algorithms

Поиск алгоритмов может быть использован для поиска определенной части строки. Замена идет еще на один шаг. После того, как найдена соответствующая часть, она заменяется чем-то другим. Замена вычисляется из оригинала, используя некоторую трансформацию.

    string str1="Hello  Dolly,   Hello World!"
    replace_first(str1, "Dolly", "Jane");      // str1 == "Hello  Jane,   Hello World!"
    replace_last(str1, "Hello", "Goodbye");    // str1 == "Hello  Jane,   Goodbye World!"
    erase_all(str1, " ");                      // str1 == "HelloJane,GoodbyeWorld!"
    erase_head(str1, 6);                       // str1 == "Jane,GoodbyeWorld!"
        

Полный список функций замены и удаления см. в разделе reference. Существует множество предопределенных функций для общего использования, однако библиотека позволяет определить пользовательский замен (), который соответствует конкретной потребности. Существует общая функция find_format(), которая занимает два параметра. Первый - объект Finder, второй - объект Formatter. Объект Finder - это фанктор, который выполняет поиск заменяющей части. Объект Форматтера принимает результат поиска (как правило, ссылка на найденное подстрое) и создает его замену. Замена алгоритма объединяет эти два и делает желаемую замену.

Проверьте boost/algorithm/string/replace.hpp, boost/algorithm/string/erase.hpp и boost/algorithm/string/find_format.hpp для справки.

Find Iterator

Расширение, чтобы найти алгоритмы это Итератор Поиска. Вместо поиска только одной части строки, поисковый итератор позволяет нам итерировать через подстрочки, соответствующие указанным критериям. Этот объект использует Finder для постепенного поиска строки. Dereferencing a find iterator yields an boost::iterator_range object, that delimits the current match.

Есть два итератора, предоставленные find_iterator и split_iterator. Бывшая итерирует над подстроями, которые обнаруживаются с использованием указанного Поиска. Последние изменяют пробелы между этими подстроками.

    string str1("abc-*-ABC-*-aBc");
    // Find all 'abc' substrings (ignoring the case)
    // Create a find_iterator
    typedef find_iterator<string::iterator> string_find_iterator;
    for(string_find_iterator It=
            make_find_iterator(str1, first_finder("abc", is_iequal()));
        It!=string_find_iterator();
        ++It)
    {
        cout << copy_range<std::string>(*It) << endl;
    }
    // Output will be:
    // abc
    // ABC
    // aBC
    
    typedef split_iterator<string::iterator> string_split_iterator;
    for(string_split_iterator It=
        make_split_iterator(str1, first_finder("-*-", is_iequal()));
        It!=string_split_iterator();
        ++It)
    {
        cout << copy_range<std::string>(*It) << endl;
    }
    // Output will be:
    // abc
    // ABC
    // aBC
        

Обратите внимание, что итераторы поиска имеют только один параметр шаблона. Это тип базового итератора. Нахождение указывается в момент запуска. Это позволяет набрать итератор поиска для общих типов строк и повторно использовать его. Кроме того, функции makeiterator помогают построить поисковый итератор для определенного диапазона.

См. ссылку в boost/algorithm/string/find_iterator.hpp.

Split

Алгоритмы разделения - это расширение поискового итератора для одного общего сценария использования. Эти алгоритмы используют поисковый итератор и хранят все спички в предоставленном контейнере. Этот контейнер должен иметь возможность хранить копии (например, std::string) или ссылки (например, iterator_range) извлеченных подступов.

Предоставляются два алгоритма. find_all() находит все копии строки в вводе. split() разделяет вход на части.

    string str1("hello abc-*-ABC-*-aBc goodbye");
    typedef vector< iterator_range<string::iterator> > find_vector_type;
    
    find_vector_type FindVec; // #1: Search for separators
    ifind_all( FindVec, str1, "abc" ); // FindVec == { [abc],[ABC],[aBc] }
    typedef vector< string > split_vector_type;
    
    split_vector_type SplitVec; // #2: Search for tokens
    split( SplitVec, str1, is_any_of("-*"), token_compress_on ); // SplitVec == { "hello abc","ABC","aBc goodbye" }
        

[hello] обозначает iterator_range делимитация этого подстроя.

Первый пример показывает, как построить контейнер, чтобы иметь ссылки на все извлеченные подстрои. Алгоритм ifind_all() помещает в FindVec ссылки на все подстрои, которые в случае-нечувствительным образом равны «abc».

Второй пример использует split(), чтобы разделить строку 1 на части, разделенные символами '-' или '*'. Эти части затем помещаются в SplitVec. Можно указать, конкатенируются или нет соседние сепараторы.

Более подробную информацию можно найти в ссылке: boost/algorithm/string/split.hpp.


PrevUpHomeNext

Статья Usage раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 2. Boost String Algorithms Library может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 2. Boost String Algorithms Library ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:45:28/0.0093328952789307/0