Boost

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Boost
Boost.png
Стабільний випуск 1.57.0 (3 листопада 2014; 49 днів тому)
Написано на С++
Операційна система Кросплатформний
Тип бібліотека (програмування)
Ліцензія Boost Software License
Сайт boost.org

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

Загальний огляд[ред.ред. код]

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[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.

Алгоритми на графах[ред.ред. код]

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.

Багатонитевість[ред.ред. код]

Докладніше: Багатонитевість

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

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

Докладніше

Виноски[ред.ред. код]

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