Boost (библиотека)

Boost (библиотека)
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<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[3] и описание операций[4].

Генерация случайных чисел

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[5].

Разбор текста

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[6].

Использование регулярных выражений

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[7].

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

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[8].

Многопоточность

Пример кода, показывающий создание потоков:

#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;
}

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

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

См. также

Примечания

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужна курсовая?

Полезное


Смотреть что такое "Boost (библиотека)" в других словарях:

  • Библиотека Boost — Boost Тип библиотека (программирование) Написана на С++ ОС Кроссплатформенный Версия Boost 1.39.0 02.05.2009 …   Википедия

  • Boost — Тип библиотека (программирование) Написана на С++ Операционная система Кроссплатформенный Последняя версия Boost 1.52.0 (05.11.2012) …   Википедия

  • Стандартная библиотека языка C++ — Стандартная библиотека языка программирования C++ fstream iomanip ios iostream sstream Стандартная библиотека шаблонов …   Википедия

  • Стандартная библиотека шаблонов — Стандартная библиотека языка программирования C++ fstream iomanip ios iostream sstream Стандартная библиотека шаблонов …   Википедия

  • Граф (теория графов) — Неориентированный граф с шестью вершинами и семью рёбрами В математической теории графов и информатике граф  это совокупность объектов со связями между ними. Объекты представляются как вершины, или узлы графа, а связи  как дуги, или рёбра. Для… …   Википедия

  • Двудольный ориентированный граф — Неориентированный граф с шестью вершинами и семью рёбрами В математической теории графов и информатике граф  это совокупность объектов со связями между ними. Объекты представляются как вершины, или узлы графа, а связи  как дуги, или рёбра. Для… …   Википедия

  • Неориентированный граф — с шестью вершинами и семью рёбрами В математической теории графов и информатике граф  это совокупность объектов со связями между ними. Объекты представляются как вершины, или узлы графа, а связи  как дуги, или рёбра. Для разных областей… …   Википедия

  • Орграф — Неориентированный граф с шестью вершинами и семью рёбрами В математической теории графов и информатике граф  это совокупность объектов со связями между ними. Объекты представляются как вершины, или узлы графа, а связи  как дуги, или рёбра. Для… …   Википедия

  • Простой цикл — Неориентированный граф с шестью вершинами и семью рёбрами В математической теории графов и информатике граф  это совокупность объектов со связями между ними. Объекты представляются как вершины, или узлы графа, а связи  как дуги, или рёбра. Для… …   Википедия

  • FlylinkDC++ — FlylinkDC++ …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»