Boost (библиотека) | это... Что такое Boost (библиотека)? (original) (raw)
Boost | |
---|---|
Тип | библиотека (программирование) |
Написана на | С++ |
Операционная система | Кроссплатформенный |
Последняя версия | Boost 1.47 (11.07.2011) |
Лицензия | 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 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
using namespace boost;
double SampleNormal (double mean, double sigma) { // выбор генератора случайных чисел mt19937 rng; // инициализация генератора числом секунд с 1970 года rng.seed(static_cast (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 #include #include
using namespace std; using namespace boost::spirit;
// Парсер разделённых запятой чисел bool parse_numbers(const char* str, vector& 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 #include
// Пример программы разбора URL int main(int argc, char** argv) { // Проверка на число параметров if (argc < 2) return 0;
// Контейнер для значений std::vectorstd::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 предоставляет гибкую и эффективную реализацию концепции графов в виде нескольких представлений графа и большого количества алгоритмов.
- Пример выполнения алгоритма топологической сортировки:
#include #include #include #include <boost/graph/adjacency_list.hpp> #include <boost/graph/topological_sort.hpp> #include #include
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::vertex_descriptor Vertex; // контейнер для цепочки вершин typedef std::vector container; // тип представления дуг графа typedef std::pairstd::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[8].
Многопоточность
Пример кода, показывающий создание потоков:
#include <boost/thread/thread.hpp> #include
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; }
Подробности можно найти в документации[9] и в статьях в Dr. Dobb's Journal, описывающих библиотеку.[10][11]
Известен также основанный на Boost.Thread проект C++ библиотеки thread pool,[12] реализующей одноимённый шаблон проектирования (англ.)русск..
См. также
Примечания
- ↑ Boost Software License
- ↑ Library Technical Report
- ↑ Basic Linear Algebra Library
- ↑ uBLAS operations overview
- ↑ Boost Random Number Library
- ↑ Spirit User's Guide
- ↑ Boost.Regex
- ↑ the Boost Graph Library
- ↑ Boost.Threads API reference
- ↑ Introduction to Boost.Threads в Dr. Dobb's Journal. (2002)
- ↑ What's New in Boost Threads? в Dr. Dobb's Journal. (2008)
- ↑ threadpool library
Ссылки
- Домашняя страница проекта (англ.)
- Список библиотек (англ.)
- Русская вики-документация по библиотекам :: Boost - (не всё переведено)
- Перевод части документации на русский язык (рус.)
- Ещё один перевод некоторых частей документации (рус.)
- Boost это просто. Часть 1. Boost.Regex (рус.)
- Boost это просто. Часть 2. Boost.Date_time (рус.)
- Boost Test (рус.)