20
Темы лекции: Введение в библиотеку Boost. Практическое задание: Введение в библиотеку Boost. Тренер: Игорь Шкулипа, к.т.н. С++ Библиотеки STL и Qt. Занятие 11

C++ STL & Qt. Занятие 11

Embed Size (px)

Citation preview

Page 1: C++ STL & Qt. Занятие 11

Темы лекции: Введение в библиотеку Boost.

Практическое задание: Введение в библиотеку Boost.

Тренер: Игорь Шкулипа, к.т.н.

С++ Библиотеки STL и Qt. Занятие 11

Page 2: C++ 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- регулярные выражения.

Page 3: C++ STL & Qt. Занятие 11

http://www.slideshare.net/IgorShkulipa 3

Как использовать BOOST в своих проектах

Прежде всего необходимо скачать исходники Boost'а с сайтаwww.boost.org. В состав архива входит и документация, и примеры. УВас могут возникнуть некоторые затруднения с тем, какая структуракаталогов должна быть после распаковки библиотеки BOOST на диск.

Обратите внимание, что в состав библиотеки Boost не входятскомпилированные файлы *.lib (или аналогичные). Вы можете либоскомпилировать их самостоятельно для своей платформы(соответствующие mak-файлы входят в состав пакета библиотекиBoost), либо использовать в проектах непосредственно исходныетексты нужных частей Boost'а.

Page 4: C++ STL & Qt. Занятие 11

http://www.slideshare.net/IgorShkulipa 4

Состав библиотеки

Библиотеки Boost охватывают следующее:

• Алгоритмы• Обход ошибок в компиляторах, не соответствующих стандарту• Многопоточное программирование• Контейнеры• Юнит-тестирование• Структуры данных• Функциональные объекты• Обобщённое программирование• Графы• Работа с геометрическими данными• Ввод-вывод• Межъязыковая поддержка• Итераторы• Математические и числовые алгоритмы• Работа с памятью• Синтаксический и лексический разбор• Метапрограммирование на основе препроцессора• «Умные указатели»• Обработка строк и текста• Метапрограммирование на основе шаблонов

Page 5: C++ STL & Qt. Занятие 11

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.

Page 6: C++ STL & Qt. Занятие 11

http://www.slideshare.net/IgorShkulipa 6

Контейнеры

• array - массив постоянного размера (в отличие от std::vector). Средиконтейнерных классов библиотеки LEM есть аналогичные.

• dynamic_bitset - версия std::bitset, которая может динамическименять размер.

• graph - реализация концепции графов

• multi_array - реализация многомерных массивов.

• property_map

• multi_index

Page 7: C++ STL & Qt. Занятие 11

http://www.slideshare.net/IgorShkulipa 7

Функциональные объекты и адаптеры

• bind и mem_fn - адаптеры для функций, объектов и методов иуказателей на них

• compose - адаптеры STL для использования их в функциональномпрограммировании

• function - функциональные объекты-обертки

• functional - улучшенные адаптеры функциональных объектов

• lambda - безымянная функция (абстракция функциональногопрограммирования)

• ref - библиотека утилит для передачи ссылок в функциональныеобъекты

• signals - реализация сигналов и слотов (другое название этойпарадигмы - делегаты).

Page 8: C++ STL & Qt. Занятие 11

http://www.slideshare.net/IgorShkulipa 8

Алгоритмы

• graph – представления графов и алгоритмы на графах

• utility - Библиотека вспомогательных шаблонов и функций.

Page 9: C++ STL & Qt. Занятие 11

http://www.slideshare.net/IgorShkulipa 9

Многопоточное программирование

• thread

• mutex

• lock

• condition

• xtime - таймеры с высоким разрешением.

Page 10: C++ STL & Qt. Занятие 11

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.

Page 11: C++ STL & Qt. Занятие 11

http://www.slideshare.net/IgorShkulipa 11

Структуры данных

• any - безопасный общий контейнер для единичного значения любоготипа.

• compressed_pair - то же, что и std::pair<>, но в случае, если один изаргументов пустой класс, то оптимизирует пару по размеру.

• tuple - реализация функций, возвращающих несколько значений.

• variant - контейнер для хранения единственного объектапроизвольного типа.

Page 12: C++ STL & Qt. Занятие 11

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.

Page 13: C++ STL & Qt. Занятие 11

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 - описано выше.

Page 14: C++ STL & Qt. Занятие 11

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();

}

Page 15: C++ STL & Qt. Занятие 11

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

Page 16: C++ STL & Qt. Занятие 11

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

Page 17: C++ STL & Qt. Занятие 11

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: [email protected]. Задавайте любые вопросы.");

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

Page 18: C++ STL & Qt. Занятие 11

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)

Page 19: C++ STL & Qt. Занятие 11

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;

}

Page 20: C++ STL & Qt. Занятие 11

http://www.slideshare.net/IgorShkulipa 20

Лабораторная работа №11. Boost

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