View
135
Download
3
Category
Preview:
Citation preview
Темы лекции: Введение в библиотеку Boost.
Практическое задание: Введение в библиотеку Boost.
Тренер: Игорь Шкулипа, к.т.н.
С++ Библиотеки STL и Qt. Занятие 11
http://www.slideshare.net/IgorShkulipa 2
Что такое библиотека BOOST C++
Библиотека BOOST C++ - это собрание множества независимыхбиблиотек, созданных независимыми разработчиками и тщательнопроверенными на различных платформах.
Можно считать, что BOOST C++ - это расширение стандартнойбиблиотеки C++. Многие вещи, предлагавшиеся для нового стандартаC++ и отвергнутые комитетом по стандартизации, осели в BOOST.
Использование компонентов BOOST C++ в своих разработках экономитзначительные усилия - особенно если планируется портировать проектна различные платформы. К примеру, в поисковом движке FAINDиспользуется несколько частей BOOST C++, в частности - библиотекадля работы с именами файлов (путями) filesystem, и библиотека regex- регулярные выражения.
http://www.slideshare.net/IgorShkulipa 3
Как использовать BOOST в своих проектах
Прежде всего необходимо скачать исходники Boost'а с сайтаwww.boost.org. В состав архива входит и документация, и примеры. УВас могут возникнуть некоторые затруднения с тем, какая структуракаталогов должна быть после распаковки библиотеки BOOST на диск.
Обратите внимание, что в состав библиотеки Boost не входятскомпилированные файлы *.lib (или аналогичные). Вы можете либоскомпилировать их самостоятельно для своей платформы(соответствующие mak-файлы входят в состав пакета библиотекиBoost), либо использовать в проектах непосредственно исходныетексты нужных частей Boost'а.
http://www.slideshare.net/IgorShkulipa 4
Состав библиотеки
Библиотеки Boost охватывают следующее:
• Алгоритмы• Обход ошибок в компиляторах, не соответствующих стандарту• Многопоточное программирование• Контейнеры• Юнит-тестирование• Структуры данных• Функциональные объекты• Обобщённое программирование• Графы• Работа с геометрическими данными• Ввод-вывод• Межъязыковая поддержка• Итераторы• Математические и числовые алгоритмы• Работа с памятью• Синтаксический и лексический разбор• Метапрограммирование на основе препроцессора• «Умные указатели»• Обработка строк и текста• Метапрограммирование на основе шаблонов
http://www.slideshare.net/IgorShkulipa 5
Работа со строками и текстом
lexical_cast - преобразование любых типов в строки и из строк в любой тип(подобно sprintf() и atoi() из библиотеки C).
format - позволяет применять привычную для программистов на C форматнуюстроку из printf() в потоковых операторах с некоторыми новыми возможностями.Кстати говоря, семейство функций printf(), несмотря на все свои недостатки(отсутствие проверки типов аргументов на стеке и невозможность расширениядля новых типов) продолжает интенсивно использоваться благодаря оченькомпактному форматированию результатов и наглядности исходного кода. В .NETFramework, несмотря на всю продвинутость, также не смогли отказаться отпарадигмы printf() - схема работы Console::WriteLine очень напоминает printf,хотя и вводит для безопасности контроль типов аргументов.
regex - мощная библиотека регулярных выражений. Документация. В поисковомдвижке FAIND реализована поддержка расширенных регулярных выражений, вкоторых можно работать с грамматическими свойствами слов (приводить кбазовым формам, работать с грамматическими кванторами).
tokenizer - разбиение строки на части по разделителям (лексер). Библиотека C++LEM содержит шаблонный класс BaseLexer<>, который выполняет разбивкутекста на лексемы и их токенизацию, а также целый набор классов (Iridium),которые реализуют полный препроцессор C.
http://www.slideshare.net/IgorShkulipa 6
Контейнеры
• array - массив постоянного размера (в отличие от std::vector). Средиконтейнерных классов библиотеки LEM есть аналогичные.
• dynamic_bitset - версия std::bitset, которая может динамическименять размер.
• graph - реализация концепции графов
• multi_array - реализация многомерных массивов.
• property_map
• multi_index
http://www.slideshare.net/IgorShkulipa 7
Функциональные объекты и адаптеры
• bind и mem_fn - адаптеры для функций, объектов и методов иуказателей на них
• compose - адаптеры STL для использования их в функциональномпрограммировании
• function - функциональные объекты-обертки
• functional - улучшенные адаптеры функциональных объектов
• lambda - безымянная функция (абстракция функциональногопрограммирования)
• ref - библиотека утилит для передачи ссылок в функциональныеобъекты
• signals - реализация сигналов и слотов (другое название этойпарадигмы - делегаты).
http://www.slideshare.net/IgorShkulipa 8
Алгоритмы
• graph – представления графов и алгоритмы на графах
• utility - Библиотека вспомогательных шаблонов и функций.
http://www.slideshare.net/IgorShkulipa 9
Многопоточное программирование
• thread
• mutex
• lock
• condition
• xtime - таймеры с высоким разрешением.
http://www.slideshare.net/IgorShkulipa 10
Математические и числовые функции
• math - некоторые реализации теоретической математики в виде шаблонов.Реализация многих численных методов есть в математическом разделебиблиотеки LEM.
• integer - некоторые операции с целыми числами реализованные в видешаблонов, работа с битовыми масками и пр.
• math/common_factor - нахождение наибольшего общего делителя (GCD) инаименьшего общего множителя (LCM) для двух чисел. Реализации как времениисполнения, так и компиляции.
• math/octonion - реализация октонионов• math/quaterion - реализация квартерионов• math/special_functions - некоторые специальные математические функции
типа гиперболического синуса. Требуются для реализации октонионов иквартарионов. В математическом разделе библиотеки LEM есть набор численныхметодов вычисления многих специальных функций, а также тестовыепрограммы.
• random - генераторы псевдослучайных чисел и средства для полученияразличных распределений вероятности. Много различных генераторовпсевдослучайных чисел и тестовых программ для проверки их качествареализовано в математическом разделе библиотеки LEM.
• rational - реализация рациональных чисел (дробей).• uBLAS - основная линейная алгебра для плотных, упакованных и разряженных
матриц. Некоторые численные алгоритмы линейной алгебры реализованы вматематическом разделе библиотеки LEM.
http://www.slideshare.net/IgorShkulipa 11
Структуры данных
• any - безопасный общий контейнер для единичного значения любоготипа.
• compressed_pair - то же, что и std::pair<>, но в случае, если один изаргументов пустой класс, то оптимизирует пару по размеру.
• tuple - реализация функций, возвращающих несколько значений.
• variant - контейнер для хранения единственного объектапроизвольного типа.
http://www.slideshare.net/IgorShkulipa 12
Работа с памятью
• pool - управление памятью в виде пулов
• smart_ptr - "Умные" указатели.
• utility - определяет базовый класс noncopyable длянекопируемых классов, а также шаблоны next() и prior() дляитераторов, checked_delete() и checked_array_delete() дляудаления указателя и указателя на массив с проверкой типовна этапе компиляции, шаблон addressof() возвращающийадрес объекта. Шаблон tie() создан для более удобнойзамены std::make_pair(). А также содержит шаблоны дляреализации идиомы Base-from-Member.
http://www.slideshare.net/IgorShkulipa 13
Прочее
• filesystem - работа с файловой системой, путями, именами файлов.
• conversion - помимо lexical_cast<>, содержит polymorphic_cast<> иpolymorphic_downcast<> для безопасного полиморфногопреобразования типов, а так же numeric_cast<> для безопасногопреобразования числовых типов (например из double в short).
• crc - вычисление контрольной суммы.
• date_time - работа с датой, временем и промежутками времени.
• timer - таймеры, отображение progress bar на стандартный вывод.
• utility - описано выше.
http://www.slideshare.net/IgorShkulipa 14
Пример. Thread
#include <boost/thread/thread.hpp>
#include <boost/thread/xtime.hpp>
#include <iostream>
using namespace std;
using namespace boost;
struct thread_alarm {
thread_alarm(int secs) : m_secs(secs) { }
void operator()() {
xtime xt;
xtime_get(&xt, TIME_UTC);
xt.sec += m_secs;
thread::sleep(xt);
cout << "alarm sounded..." << endl;
}
int m_secs;
};
int main(int argc, char* argv[]){
int secs = 5;
cout << "setting alarm for 5 seconds..." << endl;
thread_alarm alarm(secs);
thread thrd(alarm);
thrd.join();
}
http://www.slideshare.net/IgorShkulipa 15
Пример. Tokenizer
string s = "This is, a test";
tokenizer<> tok(s);
for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg)
{
cout << *beg << "\n";
}
Результат:
This
is
a
test
http://www.slideshare.net/IgorShkulipa 16
Пример. lexical_cast и format
short n = lexical_cast(*argv[1])
show_error("Error: "+lexical_cast(err))
cout << format("(x,y) = (%+5d,%+5d) \n") % -23 % 35
http://www.slideshare.net/IgorShkulipa 17
Пример. Regex
using namespace std;
using namespace boost;
regex expression(
"([_a-zA-Z\\d\\-\\.]+)@([_a-zA-Z\\d\\-]+(\\.[_a-zA-Z\\d\\-
]+)+)");
string
str("Мой E-mail: test@test.com. Задавайте любые вопросы.");
cmatch what;
if(regex_search(str, what, expression)) {
string name,domain;
name.assi gn(what[1].first, what[1].second);
domain.assign(what[2].first, what[2].second);
cout << "Имя: " << name;
cout << ", домен: " << domain << endl;
} else
cout << "E-Mail в строке не найден" << endl;
Результат:
Имя: sem, домен: ciam.ru
http://www.slideshare.net/IgorShkulipa 18
Пример. Алгоритм Прима
// named parameter version
template <class Graph, class PredMap, class P, class T, class R>
void prim_minimum_spanning_tree(const Graph& g, PredMap p_map,
const bgl_named_params<P, T, R>& params)
// non-named parameter version
template <class Graph, class DijkstraVisitor,
class PredecessorMap, class DistanceMap,
class WeightMap, class IndexMap>
void prim_minimum_spanning_tree(const Graph& g,
typename graph_traits<Graph>::vertex_descriptor s,
PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
IndexMap index_map, DijkstraVisitor vis)
http://www.slideshare.net/IgorShkulipa 19
Пример. Алгоритм Прима
#include <boost/config.hpp>
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/prim_minimum_spanning_tree.hpp>
using namespace boost;
int main()
{
std::vector < graph_traits < Graph >::vertex_descriptor >
p(num_vertices(g));
prim_minimum_spanning_tree(g, &p[0]);
for (std::size_t i = 0; i != p.size(); ++i)
if (p[i] != i)
std::cout << "parent[" << i << "] = " << p[i] << std::endl;
else
std::cout << "parent[" << i << "] = no parent" << std::endl;
return EXIT_SUCCESS;
}
http://www.slideshare.net/IgorShkulipa 20
Лабораторная работа №11. Boost
В индивидуальных курсовых проектах, при необходимости,использовать библиотеку Boost.
Recommended