Interested Article - Boost

Boost — собрание библиотек классов, использующих функциональность языка C++ и предоставляющих удобный кроссплатформенный высокоуровневый интерфейс для лаконичного кодирования различных повседневных подзадач программирования (работа с данными , алгоритмами , файлами , потоками , регулярными выражениями , линейная алгебра , генерация псевдослучайных чисел , обработка изображений , модульное тестирование и т. п.). Версия 1.76 содержит 164 отдельные библиотеки.

Свободно распространяются по лицензии Boost Software License , разработанной для того, чтобы Boost можно было использовать как со свободным , так и с проприетарными программными проектами, вместе с исходным кодом. Проект был создан после принятия стандарта C++ , когда многие были недовольны отсутствием некоторых библиотек в STL . Проект является своего рода «испытательным полигоном» для различных расширений языка и части библиотек , которые являются кандидатами на включение в следующий стандарт C++ . Многие из основателей Boost входят в комитет по стандартизации C++, и несколько библиотек Boost были приняты для включения в C++ Technical Report 1 , стандарт C++11 (например, интеллектуальные указатели, потоки, регулярные выражения, random, ratio, tuple) и стандарт C++17 (например, filesystem, any, optional, variant, string_view). Boost имеет заметную направленность на исследования и расширяемость ( метапрограммирование и обобщённое программирование с активным использованием шаблонов ).

Сообщество Boost появилось примерно в 1998 году, когда была выпущена первая версия стандарта. С тех пор оно постоянно росло и теперь играет важную роль в стандартизации 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, предназначенная для написания синтаксических анализаторов ( жарг. парсеров от англ. parser ; «parse» — анализ, разбор) напрямую в 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 — библиотека работы с регулярными выражениями . Имеет необходимую функциональность для фильтрации, поиска, разбора и обработки текста.

Поддерживает 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 .

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

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

#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 << "Здравствуй, мир, я - thread!" << endl;
}

int main(int argc, char* argv[])
{
  // запустить новый поток, вызывающий функцию "hello_world"
  boost::thread my_thread(&hello_world);
  // ждем завершения потока
  my_thread.join();

  return 0;
}

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

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

См. также

Примечания

  1. . Дата обращения: 26 апреля 2023. 18 апреля 2021 года.
  2. . Дата обращения: 19 февраля 2006. 29 августа 2008 года.
  3. . Дата обращения: 19 февраля 2006. 11 декабря 2017 года.
  4. . Дата обращения: 19 февраля 2006. 2 декабря 2008 года.
  5. . Дата обращения: 7 августа 2011. 7 августа 2011 года.
  6. . Дата обращения: 28 января 2011. 25 февраля 2009 года.
  7. .
  8. . Дата обращения: 23 июля 2012. 3 июня 2012 года.
  9. . Дата обращения: 15 декабря 2008. 13 октября 2008 года.
  10. от 5 сентября 2008 на Wayback Machine в Dr. Dobb's Journal . (2002)
  11. от 21 февраля 2009 на Wayback Machine в Dr. Dobb's Journal . (2008)
  12. . Дата обращения: 5 мая 2022. 15 июня 2020 года.

Ссылки

  • (англ.)
  • (англ.)
  • (рус.)
  • (рус.)
  • (рус.)
  • (рус.)
  • (рус.)

Литература

  • Джереми Сик, Лай-Кван Ли, Эндрю Ламсдэйн. C++ Boost Graph Library. — Питер, 2006. — 304 с. — ISBN 5-469-00352-3 .
  • Björn Karlsson. . — Addison-Wesley, 2005. — 388 с. — ISBN 9780321133540 .
  • Arindam Mukherjee. . — Packt, 2015. — 558 с. — ISBN 9781783551217 .
  • Antony Polukhin. Boost C++ Application Development Cookbook. — Packt, 2013. — 348 с. — ISBN 9781849514897 .
  • Dmytro Radchuk. . — Packt, 2016. — 248 с. — ISBN 9781783986545 .
  • John Torjo. . — Packt, 2014. — 156 с. — ISBN 9781782163275 .
  • Антон Полухин. Разработка приложений на C++ с использованием Boost. — ДМК Пресс, 2020. — 346 с. — ISBN 978-5-97060-868-5 .
Источник —

Same as Boost