Boost

Boost
Типбібліотека (програмування)
Стабільний випуск1.78.0 (8 жовтня 2021; 3 роки тому (2021-10-08))
Операційна системаКросплатформний
Мова програмуванняС++
ЛіцензіяBoost Software License
Онлайн-документаціяboost.org/doc/libs/release/
Репозиторійgithub.com/boostorg/boost
Вебсайтboost.org

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

Загальний огляд

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 [Архівовано 2 грудня 2008 у Wayback Machine.] і опис операцій.

Генерація випадкових чисел

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 [Архівовано 2 грудня 2008 у Wayback Machine.].

Розбір тексту

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 [Архівовано 15 лютого 2009 у Wayback Machine.].

Використання регулярних виразів

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[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 [Архівовано 25 лютого 2009 у Wayback Machine.].

Алгоритми на графах

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;
}

Докладніше Boost Graph Library [Архівовано 14 жовтня 2008 у Wayback Machine.].

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

Приклад коду, що показує створення ниток:

#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;
}

Докладніше

Ліцензія

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

Виноски

  1. Library Technical Report. Архів оригіналу за 11 грудня 2017. Процитовано 26 лютого 2009.
  2. Список бібліотек Boost. Архів оригіналу за 18 квітня 2021. Процитовано 18 квітня 2021.
  3. Архівована копія. Архів оригіналу за 26 травня 2010. Процитовано 26 лютого 2009.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)

Посилання