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

Boost
Логотип программы Boost
Тип библиотека
Написана на C++
Операционная система Кроссплатформенный
Последняя версия
Репозиторий github.com/boostorg/boost
Состояние активное
Лицензия Boost Software License
Сайт boost.org
Логотип Викисклада Медиафайлы на Викискладе

Свободно распространяются по лицензии 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]

#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] реализующей одноимённый шаблон проектирования[англ.].

См. также

править

Примечания

править
  1. Version 1.86.0
  2. List of Boost libraries. Дата обращения: 26 апреля 2023. Архивировано 18 апреля 2021 года.
  3. Boost Software License. Дата обращения: 19 февраля 2006. Архивировано 29 августа 2008 года.
  4. Library Technical Report. Дата обращения: 19 февраля 2006. Архивировано 11 декабря 2017 года.
  5. Basic Linear Algebra Library
  6. uBLAS operations overview
  7. Boost Random Number Library. Дата обращения: 19 февраля 2006. Архивировано 2 декабря 2008 года.
  8. Spirit User’s Guide. Дата обращения: 7 августа 2011. Архивировано 7 августа 2011 года.
  9. Boost.Regex. Дата обращения: 28 января 2011. Архивировано 25 февраля 2009 года.
  10. Джереми Сик и др., 2006.
  11. 1 2 The Boost Graph Library (BGL). Дата обращения: 23 июля 2012. Архивировано 3 июня 2012 года.
  12. Boost.Threads API reference. Дата обращения: 15 декабря 2008. Архивировано 13 октября 2008 года.
  13. Introduction to Boost.Threads Архивная копия от 5 сентября 2008 на Wayback Machine в Dr. Dobb's Journal. (2002)
  14. What’s New in Boost Threads? Архивная копия от 21 февраля 2009 на Wayback Machine в Dr. Dobb's Journal. (2008)
  15. threadpool library. Дата обращения: 5 мая 2022. Архивировано 15 июня 2020 года.

Ссылки

править

Литература

править
  • Джереми Сик, Лай-Кван Ли, Эндрю Ламсдэйн. 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.