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

Ссылки

 
Начальная страница  » 
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 Home