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
Примечания
- ↑ https://github.com/boostorg/boost/releases/tag/boost-1.91.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.
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.