Обзор библиотеки Boost — различия между версиями
м |
(→Итераторы) |
||
(не показано 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<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 вводит концепцию безымянных функций.