Boost

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

CMNS: Boost у Вікісховищі

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. 

Посилання[ред. | ред. код]