VOOZH about

URL: https://ru.wikipedia.org/wiki/Boost

⇱ Boost — Википедия


Перейти к содержанию
Материал из Википедии — свободной энциклопедии
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>

usingnamespaceboost::numeric::ublas;

// "y = Ax" пример
intmain()
{
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;

return0;
}

Подробнее: документация uBLAS[5] и описание операций[6].

Генерирование псевдослучайных чисел

[править | править код]

Boost предоставляет различные генераторы псевдослучайных чисел, для каждого из которых можно задавать конкретное распределение. Пример, показывающий генерирование случайных чисел с нормальным распределением:

#include<boost/random.hpp>
#include<ctime>

usingnamespaceboost;

doubleSampleNormal(doublemean,doublesigma)
{
// выбор генератора случайных чисел
mt19937rng;
// инициализация генератора числом секунд с 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);

// пример работы
returnnormal_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>

usingnamespacestd;
usingnamespaceboost::spirit;

// Парсер разделённых запятой чисел
boolparse_numbers(constchar*str,vector<double>&v)
{
returnparse(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
intmain(intargc,char**argv)
{
// Проверка на число параметров
if(argc<2)return0;

// Контейнер для значений
std::vector<std::string>values;
// Выражение для разбора
boost::regexexpression(
// proto host port
"^(?:([^:/?#]+)://)?(\\w+[^/?#:]*)(?::(\\d+))?"
// path file parameters
"(/?(?:[^?#/]*/)*)?([^?#]*)?(\\?(.*))?"
);
// Формирование исходной строки для разбора (берется из командной строки)
std::stringsrc(argv[1]);

// Разбор и заполнение контейнера
if(boost::regex_split(std::back_inserter(values),src,expression))
{
// Вывод результата
constchar*names[]={"Protocol","Host","Port","Path","File","Parameters",NULL};
for(inti=0;names[i];i++)
printf("%s:%s\n",names[i],values[i].c_str());
}
return0;
}

Подробнее 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>

intmain(int,char*[])
{
usingnamespaceboost;

// тип графа
typedefadjacency_list<vecS,vecS,directedS,
property<vertex_color_t,default_color_type>>Graph;
// дескриптор вершин
typedefboost::graph_traits<Graph>::vertex_descriptorVertex;
// контейнер для цепочки вершин
typedefstd::vector<Vertex>container;
// тип представления дуг графа
typedefstd::pair<std::size_t,std::size_t>Pair;

// Дуги графа 
Pairedges[6]={Pair(0,1),Pair(2,4),
Pair(2,5),
Pair(0,3),Pair(1,4),
Pair(4,3)};
// Граф
GraphG(edges,edges+6,6);
// словарь для получения номеров вершин по дескриптору вершин
boost::property_map<Graph,vertex_index_t>::typeid=get(vertex_index,G);
// контейнер для хранения отсортированных вершин
containerc;

// выполнение алгоритма
topological_sort(G,std::back_inserter(c));

// Вывод результата: перебор дескрипторов графа в контейнере,
// получение порядковых номеров вершин
std::cout<<"Топологическая проверка: ";
for(container::reverse_iteratorii=c.rbegin();ii!=c.rend();++ii)
std::cout<<id[*ii]<<" ";
std::cout<<std::endl;

return0;
}

Подробнее Boost Graph Library[11].

Многопоточность

[править | править код]

Пример кода, показывающий создание потоков:

#include<boost/thread/thread.hpp>
#include<iostream>

usingnamespacestd;

voidhello_world()
{
cout<<"Здравствуй, мир, я - thread!"<<endl;
}

intmain(intargc,char*argv[])
{
// запустить новый поток, вызывающий функцию "hello_world"
boost::threadmy_thread(&hello_world);
// ждем завершения потока
my_thread.join();

return0;
}

Подробности можно найти в документации[12] и в статьях в Dr. Dobb's Journal, описывающих библиотеку.[13][14]

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

Примечания

[править | править код]
  1. Release 1.90.0 — 2025.
  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 года.

Литература

[править | править код]