Boost (библиотека) | это... Что такое Boost (библиотека)? (original) (raw)

Boost
Boost.png
Тип библиотека (программирование)
Написана на С++
Операционная система Кроссплатформенный
Последняя версия 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] реализующей одноимённый шаблон проектирования (англ.)русск..

См. также

Примечания

  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. the Boost Graph Library
  9. Boost.Threads API reference
  10. Introduction to Boost.Threads в Dr. Dobb's Journal. (2002)
  11. What's New in Boost Threads? в Dr. Dobb's Journal. (2008)
  12. threadpool library

Ссылки