Обзор библиотеки Boost — различия между версиями

Материал из SEWiki
Перейти к: навигация, поиск
м
(Итераторы)
 
(не показано 7 промежуточных версий 1 участника)
Строка 3: Строка 3:
 
== Умные указатели ==
 
== Умные указатели ==
  
Все рассмотренные в прошлом семестре <<умные> указатели [http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/smart_ptr.htm представлены
+
Все рассмотренные в прошлом семестре <<умные> указатели [http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/smart_ptr.htm представлены]
 
в библиотеке Boost.
 
в библиотеке Boost.
  
Строка 10: Строка 10:
 
* <code>weak_ptr</code> --- ссылка на объект, который находится под управлением <code>shared_ptr</code>. Следует отметить, что через этот указатель нельзя обратиться к объекту напрямую --- можно только создать <code>shared_ptr</code>, указывающий на этот объект, с помощью метода <code>lock()</code> --- если объект уже уничтожен, то возвращается пустой <code>shared_ptr</code>.
 
* <code>weak_ptr</code> --- ссылка на объект, который находится под управлением <code>shared_ptr</code>. Следует отметить, что через этот указатель нельзя обратиться к объекту напрямую --- можно только создать <code>shared_ptr</code>, указывающий на этот объект, с помощью метода <code>lock()</code> --- если объект уже уничтожен, то возвращается пустой <code>shared_ptr</code>.
 
* <code>intrusive_ptr<T></code> --- аналог <code>shared_ptr<T></code>; требует, чтобы у типа <code>T</code> были определены методы intrusive_ptr_add_ref() и intrusive_ptr_release(). У <code>intrusive_ptr</code>, по крайней мере, два преимущества перед <code>shared_ptr</code>:
 
* <code>intrusive_ptr<T></code> --- аналог <code>shared_ptr<T></code>; требует, чтобы у типа <code>T</code> были определены методы intrusive_ptr_add_ref() и intrusive_ptr_release(). У <code>intrusive_ptr</code>, по крайней мере, два преимущества перед <code>shared_ptr</code>:
  * размер объекта <code>intrusive_ptr</code> совпадает с размером указателя,
+
** размер объекта <code>intrusive_ptr</code> совпадает с размером указателя,
  * объекта <code>intrusive_ptr<T></code> можно проинициализировать <code>T*</code>.
+
** объекта <code>intrusive_ptr<T></code> можно проинициализировать от произвольного <code>T*</code>.
 +
 
 +
Версия <<умного>> указателя с суффиксом <code>_array</code> управляет временем жизни массива, а не
 +
отдельного объекта
 +
 
 +
== Строковые алгоритмы ==
 +
 
 +
[http://www.boost.org/doc/libs/1_46_1/doc/html/string_algo/quickref.html Строковые алгоритмы] Boost являются
 +
обобщением и расширением методов строковых классов STL и алгоритмов STL, предназначенных для работы с последовательностями.
 +
 
 +
* Преобразование регистра: <code>to_upper(input)</code> и <code>to_lower(iput)</code>.
 +
* Удаление пробельных символов в начале и в конце строки <code>trim_left[_if](input [, predicate])</code>, <code>trim_right[_if](input[, predicate]</code> и <code>trim[_if](input[, predicate])</code>.
 +
* Предикаты: <code>[i]strarts_with(range1, range2 [, comp])</code>, <code>[i]ends_with(range1, range2 [, comp])</code>, <code>[i]contains(range1, range2 [, comp])</code>, <code>[i]equals(range1, range2 [, comp])</code>, <code>[i]lexicographical_compare(range1, range2 [, comp])</code>.
 +
* Алгоритмы поиска: <code>[i]find_first(input, search)</code>, <code>[i]find_last(input, search)</code>, <code>[i]find_nth(input, search)</code>, <code>[i]find_regex(input, regex)</code>.
 +
* Алгоритмы замены: <code>[i][replace|erase]_first(input, search [, format])</code>, <code>[i][replace|erase]_last(input, search [, format])</code>, <code>[i][replace|erase]_nth(input, search [, format])</code>, <code>[i][replace|erase]_regex(input, regex [,format])</code>.
 +
* <code>split[_regex](result, input [, predicate | regex])</code> и <code>join(input, separator)</code>.
 +
* Функторы-классификаторы символов
 +
 
 +
Существуют версии этих алгоритмов с суффиксом <code>_copy</code>, которые выполняют те же действия над копией входной строки и возвращают ее.
 +
 
 +
== Итераторы ==
 +
 
 +
Библиотека [http://www.boost.org/doc/libs/1_46_1/libs/iterator/doc/index.html итераторов] Boost расширяет концепцию итераторов STL.
 +
 
 +
* <code>counting_iterator<Incrementable></code> --- реализует концепцию <<ленивой>> последовательности --- итератор получает новое значение, выполняя операцию <code>Incrementable::operator++</code> над обернутым объектом.
 +
* <code>filter_iterator<Predicate, Iterator></code> --- итерирует подмножество значений обернутого итератора.
 +
* <code>function_output_iterator<UnaryFunction></code> --- преобразует записываемое в итератор значение с помощью указанной функции.
 +
* <code>indirect_iterator<Iterator></code> --- итерирует объекты, на которые указывают значения другого итератора.
 +
* <code>permutation_iterator<ElementIterator, IndexIterator></code> --- итерирует по перестановкам значений итераторя ElementIterator, задаваемым итератором IndexIterator.
 +
* <code>reverse_iterator<Iterator></code> --- расширение стандартного обратного итератора.
 +
* <code>shared_container_iterator<Container></code> --- продлевает жизнь захваченному контейнеру: пока существует итератор контейнер не будет уничтожен.
 +
* <code>transform_iterator<UnaryFunction, Iterator></code> --- вызывает UnaryFunction над значением обернутого итератора при каждом разыменовании м возвращает результат.
 +
* <code>zip_iterator<IteratorTuple></code> --- итерирует множество итераторов.
 +
 
 +
== <code>bind</code> и <code>lambda</code> ==
 +
 
 +
Модуль [http://www.boost.org/doc/libs/1_46_1/libs/bind/bind.html <code>bind</code>] библиотеки Boost является обобщением функций <code>std::bind1st</code> и <code>std::bind2nd</code>.
 +
 
 +
<source lang="cpp">
 +
bind(g, _1, _1, _1)(x, y, z);    // g(x, x, x)
 +
</source>
 +
 
 +
Модуль [http://www.boost.org/doc/libs/1_46_1/doc/html/lambda/using_library.html <code>lambda</code>] библиотеки Boost вводит концепцию безымянных функций.

Текущая версия на 04:17, 11 июня 2012

Мы рассмотрим несколько полезных модулей библиотеки Boost,

Умные указатели

Все рассмотренные в прошлом семестре <<умные> указатели представлены в библиотеке Boost.

  • scoped_ptr и scoped_array,
  • shared_ptr и shared_array,
  • weak_ptr --- ссылка на объект, который находится под управлением shared_ptr. Следует отметить, что через этот указатель нельзя обратиться к объекту напрямую --- можно только создать shared_ptr, указывающий на этот объект, с помощью метода lock() --- если объект уже уничтожен, то возвращается пустой shared_ptr.
  • intrusive_ptr<T> --- аналог shared_ptr<T>; требует, чтобы у типа T были определены методы intrusive_ptr_add_ref() и intrusive_ptr_release(). У intrusive_ptr, по крайней мере, два преимущества перед shared_ptr:
    • размер объекта intrusive_ptr совпадает с размером указателя,
    • объекта intrusive_ptr<T> можно проинициализировать от произвольного T*.

Версия <<умного>> указателя с суффиксом _array управляет временем жизни массива, а не отдельного объекта

Строковые алгоритмы

Строковые алгоритмы Boost являются обобщением и расширением методов строковых классов STL и алгоритмов STL, предназначенных для работы с последовательностями.

  • Преобразование регистра: to_upper(input) и to_lower(iput).
  • Удаление пробельных символов в начале и в конце строки trim_left[_if](input [, predicate]), trim_right[_if](input[, predicate] и trim[_if](input[, predicate]).
  • Предикаты: [i]strarts_with(range1, range2 [, comp]), [i]ends_with(range1, range2 [, comp]), [i]contains(range1, range2 [, comp]), [i]equals(range1, range2 [, comp]), [i]lexicographical_compare(range1, range2 [, comp]).
  • Алгоритмы поиска: [i]find_first(input, search), [i]find_last(input, search), [i]find_nth(input, search), [i]find_regex(input, regex).
  • Алгоритмы замены: [i][replace|erase]_first(input, search [, format]), [i][replace|erase]_last(input, search [, format]), [i][replace|erase]_nth(input, search [, format]), [i][replace|erase]_regex(input, regex [,format]).
  • split[_regex](result, input [, predicate | regex]) и join(input, separator).
  • Функторы-классификаторы символов

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

Итераторы

Библиотека итераторов Boost расширяет концепцию итераторов STL.

  • counting_iterator<Incrementable> --- реализует концепцию <<ленивой>> последовательности --- итератор получает новое значение, выполняя операцию Incrementable::operator++ над обернутым объектом.
  • filter_iterator<Predicate, Iterator> --- итерирует подмножество значений обернутого итератора.
  • function_output_iterator<UnaryFunction> --- преобразует записываемое в итератор значение с помощью указанной функции.
  • indirect_iterator<Iterator> --- итерирует объекты, на которые указывают значения другого итератора.
  • permutation_iterator<ElementIterator, IndexIterator> --- итерирует по перестановкам значений итераторя ElementIterator, задаваемым итератором IndexIterator.
  • reverse_iterator<Iterator> --- расширение стандартного обратного итератора.
  • shared_container_iterator<Container> --- продлевает жизнь захваченному контейнеру: пока существует итератор контейнер не будет уничтожен.
  • transform_iterator<UnaryFunction, Iterator> --- вызывает UnaryFunction над значением обернутого итератора при каждом разыменовании м возвращает результат.
  • zip_iterator<IteratorTuple> --- итерирует множество итераторов.

bind и lambda

Модуль bind библиотеки Boost является обобщением функций std::bind1st и std::bind2nd.

bind(g, _1, _1, _1)(x, y, z);     // g(x, x, x)

Модуль lambda библиотеки Boost вводит концепцию безымянных функций.