Boost (библиотека)
Boost — собрание библиотек, расширяющих C++. Cвободно распространяются по лицензии Boost Software License вместе с исходниками. Проект был создан после принятия стандарта C++, когда многие были недовольны невключением в стандарт некоторых библиотек. Проект является cвоего рода «испытательным полигоном» для различных расширений языка и часть библиотек являются кандидатами на включение в следующий стандарт C++.
Boost имеет заметную направленость на исследования и расширяемость (метапрограммирование и обобщённое программирование с активным использованием шаблонов). Благодаря тщательному подбору и контролю качества, библиотеки, включённые в Boost обладают высокой надёжностью и производительностью. Мнения относительно использования различаются. Некоторые считают его стандартом де-факто и необходимым дополнением к STL. Некоторые, напротив, избегают всякого использования библиотеки в проектах, так как это лишняя зависимость в проекте и для использования этих библиотек программисту необходимо хорошо владеть современным стандартом C++, так как некоторые части Boost требуют довольно хорошей подготовки программиста и являются весьма сложными. Близкое знакомство разработчиков с этой библиотекой воспитывает, учит их правильному минималистическому дизайну, равно как блестящему пониманию и владению C++.
Содержание |
Библиотеки
Библиотеки 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 и описание операций.
Генерация случайных чисел
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(char const* str, vector<double>& v) { return parse(str, // начало грамматики ( real_p[push_back_a(v)] >> *(',' >> real_p[push_back_a(v)]) ) , // конец грамматики space_p).full; }
Алгоритмы на графах
Boost Graph предаставляет гибкую и эффективную реализацию концепции графов ввиде нескольких представлений графа и большого количества алгоритмов.
- Пример выполнения алгоритма топологической сортировки:
#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; }
Ссылки
- Домашняя страница проекта(англ.)
- Список библиотек(англ.)
- Перевод части документации на русский язык
- Ещё один перевод некоторых частей документации