Boost
- Медіафайли у Вікісховищі
Boost — набір бібліотек, які розширюють функціональність C++. Більшість бібліотек поширюються під ліцензією Boost Software License [Архівовано 29 серпня 2008 у Wayback Machine.], розробленої для використання як з проєктами з відкритим сирцевим кодом, так і закритим. Проєкт був створений після прийняття стандарту C++, коли багато хто був незадоволеним невключенням в стандарт деяких бібліотек. Багато з фундаторів Boost є членами комітету зі стандартизіції C++ і декілька Boost бібліотек були прийняті для включення до Technical Report 1[1] та C++0x. Версія 1.76 налічує вже 164 окремі бібліотеки[2].
Загальний огляд
Boost має помітну спрямованість на дослідження і розширюваність (метапрограмування і узагальнене програмування з активним використанням шаблонів). Завдяки ретельному підбору і контролю якості бібліотеки, включені в 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 [Архівовано 2 грудня 2008 у Wayback Machine.] і опис операцій.
Генерація випадкових чисел
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 [Архівовано 2 грудня 2008 у Wayback Machine.].
Розбір тексту
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 [Архівовано 15 лютого 2009 у Wayback Machine.].
Використання регулярних виразів
Boost.Regex — бібліотека роботи з регулярними виразами. Має необхідний функціонал для фільтрації, пошуку, розбору і обробки тексту.
Приклад програми для розбору тексту
#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 [Архівовано 25 лютого 2009 у Wayback Machine.].
Алгоритми на графах
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; }
Докладніше Boost Graph Library [Архівовано 14 жовтня 2008 у Wayback Machine.].
Багатопотоковість
Приклад коду, що показує створення ниток:
#include <boost/thread/thread.hpp> #include <iostream> using namespace std; void hello_world() { cout << "Привіт світ, я потік!" << endl; } int main(int argc, char* argv[]) { // запустити новий потік, що викликає функцію "hello_world" boost::thread my_thread (&hello_world); // чекаємо завершення потоку my_thread.join(); return 0; }
Докладніше
- Introduction to Boost.Threads [Архівовано 5 вересня 2008 у Wayback Machine.] в Dr. Dobb's Journal. (2002)
- переклад українською (Introduction to Boost.Threads) [Архівовано 26 серпня 2011 у Wayback Machine.]. (2011)
- What's New in Boost Threads? [Архівовано 21 лютого 2009 у Wayback Machine.] в Dr. Dobb's Journal. (2008)
- Boost.Threads API reference [Архівовано 13 жовтня 2008 у Wayback Machine.].
- threadpool library [Архівовано 15 червня 2020 у Wayback Machine.] на основі Boost.Thread
Ліцензія
Boost ліцензується власною вільною ліцензією, відомою як Boost Software License[3].
Виноски
- ↑ Library Technical Report. Архів оригіналу за 11 грудня 2017. Процитовано 26 лютого 2009.
- ↑ Список бібліотек Boost. Архів оригіналу за 18 квітня 2021. Процитовано 18 квітня 2021.
- ↑ Архівована копія. Архів оригіналу за 26 травня 2010. Процитовано 26 лютого 2009.
{{cite web}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
Посилання
- Домашня сторінка проєкту [Архівовано 24 лютого 2009 у Wayback Machine.](англ.)
- Список бібліотек [Архівовано 2 грудня 2008 у Wayback Machine.](англ.)
- Smart Pointers to boost your code
- Building Boost libraries [Архівовано 5 лютого 2009 у Wayback Machine.]
- Переклад частини документації російською мовою
- Ще один переклад деяких частин документації [Архівовано 27 вересня 2007 у Wayback Machine.]
- Ще одна частково перекладена підбірка документації з Boost [Архівовано 9 липня 2009 у Wayback Machine.]
- Статті про Boost на сайті RSDN [Архівовано 8 грудня 2008 у Wayback Machine.]
Це незавершена стаття про програмування. Ви можете допомогти проєкту, виправивши або дописавши її. |
- п
- о
- р
Масово-паралельна архітектура · Суперскалярність · Векторний процесор · Суперкомп'ютер · Beowulf