Light-industry-up.ru

Экосистема промышленности

Boost (библиотека)

27-05-2023

Boost
Тип

библиотека (программирование)

Написана на

С++

Операционная система

Кроссплатформенный

Последняя версия

Boost 1.51.0 (20.08.2012)

Лицензия

Boost Software License

Сайт

http://www.boost.org/

Boost — собрание библиотек, расширяющих функциональность C++. Свободно распространяются по лицензии Boost Software License[1] вместе с исходным кодом. Проект был создан после принятия стандарта C++, когда многие были недовольны невключением в стандарт некоторых библиотек. Проект является своего рода «испытательным полигоном» для различных расширений языка и часть библиотек[2] являются кандидатами на включение в следующий стандарт C++.

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[3] и описание операций[4].

Генерация случайных чисел

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

Разбор текста

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

Использование регулярных выражений

Boost.Regex — библиотека работы с регулярными выражениями. Имеет необходимую функциональность для фильтрации, поиска, разбора и обработки текста.

Поддерживает PCRE, POSIX BRE и ERE

  • Пример программы для разбора текста
#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[7].

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

Boost Graph Library (BGL) предоставляет гибкую и эффективную реализацию концепции графов. Можно выбрать представление графа (например, список смежности или матрица смежности), тип данных (тип GRAPH из LEDA, Graph* из Stanford GraphBase, std::vector из STL) и алгоритм из большого набора алгоритмов, среди которых:[8]

#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[9].

Многопоточность

Пример кода, показывающий создание потоков:

#include <boost/thread/thread.hpp>
#include <iostream>
 
using namespace std; 
 
void hello_world() 
{
  cout << "Здравствуй мир, я - thread!" << endl;
}
 
int main(int argc, char* argv[]) 
{
  // запустить новый поток, вызывающий функцию "hello_world"
  boost::thread my_thread(&hello_world);
  // ждем завершения потока
  my_thread.join();
 
  return 0;
}

Подробности можно найти в документации[10] и в статьях в Dr. Dobb's Journal, описывающих библиотеку.[11][12]

Известен также основанный на Boost.Thread проект C++ библиотеки thread pool,[13] реализующей одноимённый шаблон проектирования (англ.)русск..

См. также

Примечания

  1. Boost Software License
  2. Library Technical Report
  3. Basic Linear Algebra Library
  4. uBLAS operations overview
  5. Boost Random Number Library
  6. Spirit User’s Guide
  7. Boost.Regex
  8. Джереми Сик и др., 2006
  9. ↑ The Boost Graph Library (BGL)
  10. Boost.Threads API reference
  11. Introduction to Boost.Threads в Dr. Dobb's Journal. (2002)
  12. What's New in Boost Threads? в Dr. Dobb's Journal. (2008)
  13. threadpool library

Ссылки

  • Домашняя страница проекта (англ.)
  • Список библиотек (англ.)
  • Перевод части документации на русский язык (рус.)
  • Ещё один перевод некоторых частей документации (рус.)
  • Boost это просто. Часть 1. Boost.Regex (рус.)
  • Boost это просто. Часть 2. Boost.Date_time (рус.)
  • Boost Test (рус.)

Литература

  • Джереми Сик, Лай-Кван Ли, Эндрю Ламсдэйн. C++ Boost Graph Library. — Питер, 2006. — 304 с. — ISBN 5-469-00352-3

Boost (библиотека).

© 2014–2023 light-industry-up.ru, Россия, Краснодар, ул. Листопадная 53, +7 (861) 501-67-06