Русская Википедия:Boost
Boost — собрание библиотек классов, использующих функциональность языка C++ и предоставляющих удобный кроссплатформенный высокоуровневый интерфейс для лаконичного кодирования различных повседневных подзадач программирования (работа с данными, алгоритмами, файлами, потоками, регулярными выражениями, линейная алгебра, генерация псевдослучайных чисел, обработка изображений, модульное тестирование и т. п.). Версия 1.76 содержит 164 отдельные библиотеки.[1]
Свободно распространяются по лицензии Boost Software License, разработанной для того, чтобы Boost можно было использовать как со свободным, так и с проприетарными программными проектами, вместе с исходным кодом.[2] Проект был создан после принятия стандарта C++, когда многие были недовольны отсутствием некоторых библиотек в STL. Проект является своего рода «испытательным полигоном» для различных расширений языка и части библиотек[3], которые являются кандидатами на включение в следующий стандарт 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[4] и описание операций[5].
Генерирование псевдослучайных чисел
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[6].
Разбор текста
Spirit — одна из наиболее сложных частей Boost, предназначенная для написания синтаксических анализаторов (жарг. парсеров от Шаблон:Lang-en; «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[7].
Использование регулярных выражений
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[8].
Алгоритмы на графах
Boost Graph Library (BGL) предоставляет гибкую и эффективную реализацию концепции графов. Можно выбрать представление графа (например, список смежности или матрица смежности), тип данных (тип GRAPH
из LEDA, Graph*
из Stanford GraphBase, std::vector
из STL) и алгоритм из большого набора алгоритмов, среди которых:Шаблон:Sfn
- Поиск в ширину
- Поиск в глубину
- Алгоритм Беллмана-Форда
- Алгоритм Дейкстры
- Алгоритм Прима
- Алгоритм Краскала
- Нахождение компонент связности графа
- Задача о максимальном потоке: алгоритм Эдмондса — Карпа и алгоритм проталкивания предпотока
- Обратный алгоритм Катхилла-Макки[9]
- Алгоритм топологической сортировки. Пример:
#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] реализующей Шаблон:Нп3.
См. также
- Стандартная библиотека шаблонов (STL)
- Apache Portable Runtime, используемый Apache HTTP-сервером
- Arageli
- POCO
- Loki
- GLib — библиотека, на основе которой построен GNOME
Примечания
Ссылки
- Домашняя страница проектаШаблон:Ref-en
- Список библиотекШаблон:Ref-en
- Перевод части документации на русский языкШаблон:Ref-ru
- Ещё один перевод некоторых частей документацииШаблон:Ref-ru
- Boost это просто. Часть 1. Boost.RegexШаблон:Ref-ru
- Boost это просто. Часть 2. Boost.Date_timeШаблон:Ref-ru
- Boost TestШаблон:Ref-ru
Литература
развернутьПартнерские ресурсы |
---|
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Basic Linear Algebra Library
- ↑ uBLAS operations overview
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Перейти обратно: 9,0 9,1 Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Introduction to Boost.Threads Шаблон:Wayback в Dr. Dobb's Journal. (2002)
- ↑ What’s New in Boost Threads? Шаблон:Wayback в Dr. Dobb's Journal. (2008)
- ↑ Шаблон:Cite web
- Страницы, использующие устаревший тег source
- Русская Википедия
- Свободные библиотеки программ
- Библиотеки C++
- Статьи с примерами кода C++
- Обобщённое программирование
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Википедия
- Статья из Википедии
- Статья из Русской Википедии