Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 30 ноября 2019 года; проверки требуют 10 правок.
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 30 ноября 2019 года; проверки требуют 10 правок.
Свободно распространяются по лицензии 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 и комитетом по стандартизации нет официальных отношений, некоторые разработчики активно участвуют в обеих группах.
#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].
#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();}
Spirit — одна из наиболее сложных частей Boost, предназначенная для написания синтаксических анализаторов (жарг.парсеров от англ.parser; «parse» — анализ, разбор) напрямую в 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;}
#include<boost/regex.hpp>#include<vector>#include<string>// Пример программы разбора URLintmain(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 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;}
#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;}