27-05-2023
Тип | |
---|---|
Написана на |
С++ |
Операционная система | |
Последняя версия |
Boost 1.51.0 (20.08.2012) |
Лицензия |
Boost Software License |
Сайт |
http://www.boost.org/ |
Boost — собрание библиотек, расширяющих функциональность C++. Свободно распространяются по лицензии Boost Software License[1] вместе с исходным кодом. Проект был создан после принятия стандарта C++, когда многие были недовольны невключением в стандарт некоторых библиотек. Проект является своего рода «испытательным полигоном» для различных расширений языка и часть библиотек[2] являются кандидатами на включение в следующий стандарт C++.
Boost имеет заметную направленность на исследования и расширяемость (метапрограммирование и обобщённое программирование с активным использованием шаблонов). Некоторые программисты считают его стандартом де-факто и необходимым дополнением к STL. Другие, напротив, избегают всякого использования библиотеки в проектах, опасаясь введения излишней зависимости в проект и считая, что использование этих библиотек слишком повышают требования к знанию программистом 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[3] и описание операций[4].
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[5].
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[6].
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[7].
Boost Graph Library (BGL) предоставляет гибкую и эффективную реализацию концепции графов. Можно выбрать представление графа (например, список смежности или матрица смежности), тип данных (тип GRAPH
из LEDA, Graph*
из Stanford GraphBase, std::vector
из STL) и алгоритм из большого набора алгоритмов, среди которых:[8]
#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[9].
Пример кода, показывающий создание потоков:
#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; }
Подробности можно найти в документации[10] и в статьях в Dr. Dobb's Journal, описывающих библиотеку.[11][12]
Известен также основанный на Boost.Thread проект C++ библиотеки thread pool,[13] реализующей одноимённый шаблон проектирования (англ.)русск..
Boost (библиотека).