Boost — набір бібліотек, які розширюють функціональність C++. Більшість бібліотек поширюються під ліцензією Boost Software License , розробленої для використання як з проєктами з відкритим сирцевим кодом, так і закритим. Проєкт був створений після прийняття стандарту C++, коли багато хто був незадоволеним невключенням в стандарт деяких бібліотек. Багато з фундаторів Boost є членами комітету зі стандартизіції C++ і декілька Boost бібліотек були прийняті для включення до Technical Report 1 та C++0x. Версія 1.76 налічує вже 164 окремі бібліотеки.

Загальний огляд Boost має помітну спрямованість на дослідження і розширюваність (метапрограмування і узагальнене програмування з активним використанням шаблонів). Завдяки ретельному підбору і контролю якості бібліотеки, включені в 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 і опис операцій.

Генерація випадкових чисел 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(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 .

Використання регулярних виразів Boost.Regex — бібліотека роботи з регулярними виразами. Має необхідний функціонал для фільтрації, пошуку, розбору і обробки тексту.

Приклад програми для розбору тексту #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);

// Розбір і заповнення контейнера 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 .

Алгоритми на графах 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 = { 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 .

Багатопотоковість

Приклад коду, що показує створення ниток: #include <boost/thread/thread.hpp> #include <iostream>

using namespace std;

void hello_world() { cout << "Привіт світ, я потік!" << endl; }

int main(int argc, char* argv[]) { // запустити новий потік, що викликає функцію "hello_world" boost::thread my_thread (&hello_world); // чекаємо завершення потоку my_thread.join();

return 0; } Докладніше Introduction to Boost.Threads в Dr. Dobb's Journal. (2002) переклад українською (Introduction to Boost.Threads) . (2011) What's New in Boost Threads? в Dr. Dobb's Journal. (2008) Boost.Threads API reference . threadpool library на основі Boost.Thread

Ліцензія Boost ліцензується власною вільною ліцензією, відомою як Boost Software License.

Виноски

Посилання Домашня сторінка проєкту Список бібліотек Smart Pointers to boost your code Building Boost libraries Переклад частини документації російською мовою Ще один переклад деяких частин документації Ще одна частково перекладена підбірка документації з Boost Статті про Boost на сайті RSDN