Boost
Boost | |
---|---|
Тип | библиотека |
Написана на | C++ |
Операционная система | Кроссплатформенный |
Последняя версия |
|
Репозиторий | github.com/boostorg/boost |
Состояние | активное |
Лицензия | Boost Software License |
Сайт | boost.org |
Медиафайлы на Викискладе |
Boost — собрание библиотек классов, использующих функциональность языка C++ и предоставляющих удобный кроссплатформенный высокоуровневый интерфейс для лаконичного кодирования различных повседневных подзадач программирования (работа с данными, алгоритмами, файлами, потоками, регулярными выражениями, линейная алгебра, генерация псевдослучайных чисел, обработка изображений, модульное тестирование и т. п.). Версия 1.76 содержит 164 отдельные библиотеки.[2]
Свободно распространяются по лицензии Boost Software License, разработанной для того, чтобы Boost можно было использовать как со свободным, так и с проприетарными программными проектами, вместе с исходным кодом.[3] Проект был создан после принятия стандарта C++, когда многие были недовольны отсутствием некоторых библиотек в STL.
Проект является своего рода «испытательным полигоном» для различных расширений языка и части библиотек[4], которые являются кандидатами на включение в следующий стандарт C++. Многие из основателей Boost входят в комитет по стандартизации C++, и несколько библиотек Boost были приняты для включения в C++ Technical Report 1, стандарт C++11 (например, интеллектуальные указатели, потоки, регулярные выражения, random, ratio, tuple) и стандарт C++17 (например, filesystem, any, optional, variant, string_view). Boost имеет заметную направленность на исследования и расширяемость (метапрограммирование и обобщённое программирование с активным использованием шаблонов).
Сообщество Boost появилось примерно в 1998 году, когда была выпущена первая версия стандарта. С тех пор оно постоянно росло и теперь играет важную роль в стандартизации C++. Несмотря на то, что между сообществом Boost и комитетом по стандартизации нет официальных отношений, некоторые разработчики активно участвуют в обеих группах.
Библиотеки
[править | править код]Библиотеки Boost охватывают следующее:
- Алгоритмы
- Обход ошибок в компиляторах, не соответствующих стандарту
- Многопоточное программирование
- Контейнеры
- Модульное тестирование
- Структуры данных
- Функциональные объекты
- Обобщённое программирование
- Графы
- Работа с геометрическими данными
- Ввод-вывод
- Межъязыковая поддержка
- Итераторы
- Математические и числовые алгоритмы
- Работа с памятью
- Синтаксический и лексический разбор
- Метапрограммирование на основе препроцессора
- «Умные указатели»
- Обработка строк и текста
- Метапрограммирование на основе шаблонов
Примеры
[править | править код]Линейная алгебра
[править | править код]Boost включает библиотеку линейной алгебры uBLAS с операциями для векторов и матриц.
Пример, показывающий умножение матрицы на вектор:
#include <boost/numeric/ublas/vector.hpp> #include <boost/numeric/ublas/matrix.hpp> #include <boost/numeric/ublas/io.hpp> using namespace boost::numeric::ublas; // "y = Ax" пример int main() { vector<double> x(2); x(0) = 1; x(1) = 2; matrix<double> A(2,2); A(0,0) = 0; A(0,1) = 1; A(1,0) = 2; A(1,1) = 3; vector<double> y = prod(A, x); std::cout << y << std::endl; return 0; }
Подробнее: документация uBLAS[5] и описание операций[6].
Генерирование псевдослучайных чисел
[править | править код]Boost предоставляет различные генераторы псевдослучайных чисел, для каждого из которых можно задавать конкретное распределение. Пример, показывающий генерирование случайных чисел с нормальным распределением:
#include <boost/random.hpp> #include <ctime> using namespace boost; double SampleNormal(double mean, double sigma) { // выбор генератора случайных чисел mt19937 rng; // инициализация генератора числом секунд с 1970 года rng.seed(static_cast<unsigned> (std::time(0))); // выбор нужного распределения normal_distribution<double> norm_dist(mean, sigma); // привязка генератора к распределению variate_generator<mt19937&, normal_distribution<double> > normal_sampler(rng, norm_dist); // пример работы return normal_sampler(); }
Подробнее см. Boost Random Number Library[7].
Разбор текста
[править | править код]Spirit — одна из наиболее сложных частей Boost, предназначенная для написания синтаксических анализаторов (англ. parsers) напрямую в C++-тексте программы в виде, близком к форме Бэкуса — Наура. Пример синтаксического анализатора для чтения чисел, разделённых запятой:
#include <boost/spirit/core.hpp> #include <boost/spirit/actor/push_back_actor.hpp> #include <iostream> #include <vector> #include <string> using namespace std; using namespace boost::spirit; // Парсер разделённых запятой чисел bool parse_numbers(const char* str, vector<double>& v) { return parse(str, // начало грамматики ( real_p[push_back_a(v)] >> *(',' >> real_p[push_back_a(v)]) ) , // конец грамматики space_p).full; }
Подробнее Spirit User’s Guide[8].
Использование регулярных выражений
[править | править код]Boost.Regex — библиотека работы с регулярными выражениями. Имеет необходимую функциональность для фильтрации, поиска, разбора и обработки текста.
Поддерживает PCRE, POSIX BRE и ERE
Пример программы для разбора текста:
#include <boost/regex.hpp> #include <vector> #include <string> // Пример программы разбора URL int main(int argc, char** argv) { // Проверка на число параметров if (argc < 2) return 0; // Контейнер для значений std::vector<std::string> values; // Выражение для разбора boost::regex expression( // proto host port "^(?:([^:/?#]+)://)?(\\w+[^/?#:]*)(?::(\\d+))?" // path file parameters "(/?(?:[^?#/]*/)*)?([^?#]*)?(\\?(.*))?" ); // Формирование исходной строки для разбора (берется из командной строки) std::string src(argv[1]); // Разбор и заполнение контейнера if (boost::regex_split(std::back_inserter(values), src, expression)) { // Вывод результата const char* names[] = {"Protocol", "Host", "Port", "Path", "File", "Parameters", NULL}; for (int i = 0; names[i]; i++) printf("%s:%s\n", names[i], values[i].c_str()); } return 0; }
Подробнее Boost.Regex[9].
Алгоритмы на графах
[править | править код]Boost Graph Library (BGL) предоставляет гибкую и эффективную реализацию концепции графов. Можно выбрать представление графа (например, список смежности или матрица смежности), тип данных (тип GRAPH
из LEDA, Graph*
из Stanford GraphBase, std::vector
из STL) и алгоритм из большого набора алгоритмов, среди которых:[10]
- Поиск в ширину
- Поиск в глубину
- Алгоритм Беллмана — Форда
- Алгоритм Дейкстры
- Алгоритм Прима
- Алгоритм Краскала
- Нахождение компонент связности графа
- Задача о максимальном потоке: алгоритм Эдмондса — Карпа и алгоритм проталкивания предпотока
- Обратный алгоритм Катхилл — Макки[11]
- Алгоритм топологической сортировки. Пример:
#include <iostream> #include <list> #include <algorithm> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/topological_sort.hpp> #include <iterator> #include <utility> int main(int , char* []) { using namespace boost; // тип графа typedef adjacency_list<vecS, vecS, directedS, property<vertex_color_t, default_color_type> > Graph; // дескриптор вершин typedef boost::graph_traits<Graph>::vertex_descriptor Vertex; // контейнер для цепочки вершин typedef std::vector<Vertex> container; // тип представления дуг графа typedef std::pair<std::size_t,std::size_t> Pair; // Дуги графа Pair edges[6] = { Pair(0,1), Pair(2,4), Pair(2,5), Pair(0,3), Pair(1,4), Pair(4,3) }; // Граф Graph G(edges, edges + 6, 6); // словарь для получения номеров вершин по дескриптору вершин boost::property_map<Graph, vertex_index_t>::type id = get(vertex_index, G); // контейнер для хранения отсортированных вершин container c; // выполнение алгоритма topological_sort(G, std::back_inserter(c)); // Вывод результата: перебор дескрипторов графа в контейнере, // получение порядковых номеров вершин std::cout << "Топологическая проверка: "; for (container::reverse_iterator ii = c.rbegin(); ii != c.rend(); ++ii) std::cout << id[*ii] << " "; std::cout << std::endl; return 0; }
Подробнее Boost Graph Library[11].
Многопоточность
[править | править код]Пример кода, показывающий создание потоков:
#include <boost/thread/thread.hpp> #include <iostream> using namespace std; void hello_world() { cout << "Здравствуй, мир, я - thread!" << endl; } int main(int argc, char* argv[]) { // запустить новый поток, вызывающий функцию "hello_world" boost::thread my_thread(&hello_world); // ждем завершения потока my_thread.join(); return 0; }
Подробности можно найти в документации[12] и в статьях в Dr. Dobb's Journal, описывающих библиотеку.[13][14]
Известен также основанный на Boost.Thread проект C++ библиотеки thread pool,[15] реализующей одноимённый шаблон проектирования[англ.].
См. также
[править | править код]- Стандартная библиотека шаблонов (STL)
- Apache Portable Runtime, используемый Apache HTTP-сервером
- Arageli
- POCO
- Loki
- GLib — библиотека, на основе которой построен GNOME
Примечания
[править | править код]- ↑ Version 1.86.0
- ↑ List of Boost libraries . Дата обращения: 26 апреля 2023. Архивировано 18 апреля 2021 года.
- ↑ Boost Software License . Дата обращения: 19 февраля 2006. Архивировано 29 августа 2008 года.
- ↑ Library Technical Report . Дата обращения: 19 февраля 2006. Архивировано 11 декабря 2017 года.
- ↑ Basic Linear Algebra Library
- ↑ uBLAS operations overview
- ↑ Boost Random Number Library . Дата обращения: 19 февраля 2006. Архивировано 2 декабря 2008 года.
- ↑ Spirit User’s Guide . Дата обращения: 7 августа 2011. Архивировано 7 августа 2011 года.
- ↑ Boost.Regex . Дата обращения: 28 января 2011. Архивировано 25 февраля 2009 года.
- ↑ Джереми Сик и др., 2006.
- ↑ 1 2 The Boost Graph Library (BGL) . Дата обращения: 23 июля 2012. Архивировано 3 июня 2012 года.
- ↑ Boost.Threads API reference . Дата обращения: 15 декабря 2008. Архивировано 13 октября 2008 года.
- ↑ Introduction to Boost.Threads Архивная копия от 5 сентября 2008 на Wayback Machine в Dr. Dobb's Journal. (2002)
- ↑ What’s New in Boost Threads? Архивная копия от 21 февраля 2009 на Wayback Machine в Dr. Dobb's Journal. (2008)
- ↑ threadpool library . Дата обращения: 5 мая 2022. Архивировано 15 июня 2020 года.
Ссылки
[править | править код]- Домашняя страница проекта (англ.)
- Список библиотек (англ.)
- Перевод части документации на русский язык (рус.)
- Ещё один перевод некоторых частей документации (рус.)
- Boost это просто. Часть 1. Boost.Regex (рус.)
- Boost это просто. Часть 2. Boost.Date_time (рус.)
- Boost Test (рус.)
Литература
[править | править код]- Джереми Сик, Лай-Кван Ли, Эндрю Ламсдэйн. C++ Boost Graph Library. — Питер, 2006. — 304 с. — ISBN 5-469-00352-3.
- Björn Karlsson. Beyond the C++ Standard Library: An Introduction to Boost. — Addison-Wesley, 2005. — 388 с. — ISBN 9780321133540.
- Arindam Mukherjee. Learning Boost C++ Libraries. — Packt, 2015. — 558 с. — ISBN 9781783551217.
- Antony Polukhin. Boost C++ Application Development Cookbook. — Packt, 2013. — 348 с. — ISBN 9781849514897.
- Dmytro Radchuk. Boost.Asio C++ Network Programming Cookbook. — Packt, 2016. — 248 с. — ISBN 9781783986545.
- John Torjo. Boost.Asio C++ Network Programming. — Packt, 2014. — 156 с. — ISBN 9781782163275.
- Антон Полухин. Разработка приложений на C++ с использованием Boost. — ДМК Пресс, 2020. — 346 с. — ISBN 978-5-97060-868-5.