Boost — собрание библиотек классов, использующих функциональность языка C++ и предоставляющих удобный кроссплатформенный высокоуровневый интерфейс для лаконичного кодирования различных повседневных подзадач программирования (работа с данными, алгоритмами, ами, потоками, регулярными выражениями, линейная алгебра, генерация псевдослучайных чисел, обработка изображений, модульное тестирование и т. п.). Версия 1.76 содержит 164 отдельные библиотеки.

Свободно распространяются по лицензии Boost Software License, разработанной для того, чтобы Boost можно было использовать как со свободным, так и с проприетарными программными проектами, вместе с исходным кодом. Проект был создан после принятия стандарта C++, когда многие были недовольны отсутствием некоторых библиотек в STL.

Проект является своего рода «испытательным полигоном» для различных расширений языка и части библиотек, которые являются кандидатами на включение в следующий стандарт 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; } Подробнее: документация uBLASBasic Linear Algebra Library и описание операцийuBLAS operations overview.

Генерирование псевдослучайных чисел 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.

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

Использование регулярных выражений 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);

// Разбор и заполнение контейнера 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.

Алгоритмы на графах Boost Graph Library (BGL) предоставляет гибкую и эффективную реализацию концепции графов. Можно выбрать представление графа (например, список смежности или матрица смежности), тип данных (тип GRAPH из LEDA, Graph* из Stanford GraphBase, std::vector из STL) и алгоритм из большого набора алгоритмов, среди которых: Поиск в ширину Поиск в глубину Алгоритм Беллмана — Форда Алгоритм Дейкстры Алгоритм Прима Алгоритм Краскала Нахождение компонент связности графа Задача о максимальном потоке: алгоритм Эдмондса — Карпа и алгоритм проталкивания предпотока Обратный алгоритм Катхилл — Макки Алгоритм топологической сортировки. Пример: #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 = { 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.

Многопоточность Пример кода, показывающий создание потоков: #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; } Подробности можно найти в документации и в статьях в Dr. Dobb's Journal, описывающих библиотеку.Introduction to Boost.Threads в Dr. Dobb's Journal. (2002)What’s New in Boost Threads? в Dr. Dobb's Journal. (2008)

Известен также основанный на Boost.Thread проект C++ библиотеки thread pool, реализующей одноимённый шаблон проектирования.

См. также Стандартная библиотека шаблонов (STL) Apache Portable Runtime, используемый Apache HTTP-сервером Arageli POCO Loki GLib — библиотека, на основе которой построен GNOME

Примечания

Ссылки Домашняя страница проекта Список библиотек Перевод части документации на русский язык Ещё один перевод некоторых частей документации Boost это просто. Часть 1. Boost.Regex Boost это просто. Часть 2. Boost.Date_time Boost Test

Литература

Категория:Свободные библиотеки программ Категория:Библиотеки C++ Категория:Статьи с примерами кода C++ Категория:Обобщённое программирование