Boost

Boost - збори бібліотек, що розширюють функціональність C + +. Вільно розповсюджуються за ліцензією Boost Software License [1] разом з вихідним кодом. Проект був створений після прийняття стандарту C + +, коли багато хто були незадоволені невключенням в стандарт деяких бібліотек. Проект є свого роду "випробувальним полігоном" для різних розширень мови і частина бібліотек [2] є кандидатами на включення в Наступного стандарт C + +.

Boost має помітну спрямованість на дослідження і розширюваність ( метапрограмування і узагальнене програмування з активним використанням шаблонів). Деякі програмісти вважають його стандартом де-факто і необхідним доповненням до STL. Інші, навпаки, уникають всякого використання бібліотеки в проектах, побоюючись введення надмірної залежності в проект і вважаючи, що використання цих бібліотек занадто підвищують вимоги до знання програмістом C + +, так як деякі частини Boost є досить складними.


1. Бібліотеки

Бібліотеки Boost охоплюють наступне:


2. Приклади

2.1. Лінійна алгебра

Boost включає бібліотеку лінійної алгебри uBLAS, з операціями для векторів і матриць.

  • Приклад, що показує множення матриці на вектор:
 # Include   # Include   # Include   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].


2.2. Генерація випадкових чисел

Boost надає різні генератори псевдовипадкових чисел, для кожного з яких можна задавати конкретне розподіл.

 # Include   # Include   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].


2.3. Розбір тексту

Spirit - одна з найбільш складних частин Boost, призначена для написання парсерів безпосередньо в C + + тексті програми у вигляді близькому до формі Бекуса-Наура.

  • Парсер для читання чисел, розділених комою:
 # Include   # Include   # Include   # Include   # Include   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].


2.4. Використання регулярних виразів

Boost.Regex - бібліотека роботи з регулярними виразами. Має необхідну функціональність для фільтрації, пошуку, розбору й обробки тексту.

Підтримує PCRE, POSIX BRE і ERE

  • Приклад програми для розбору тексту
 # Include   # Include   # Include   / / Приклад програми розбору 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].


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

Boost Graph Library (BGL) надає гнучку і ефективну реалізацію концепції графів. Можна вибрати подання графа (наприклад, список суміжності або матриця суміжності), тип даних (тип GRAPH з LEDA, Graph* з Stanford GraphBase, std::vector з STL) і алгоритм з великого набору алгоритмів, серед яких: [8]

 # Include   # Include   # Include   # Include   # Include   # 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  <  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].


2.6. Багатопоточність

Приклад коду, що показує створення потоків:

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

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

Відомий також заснований на Boost.Thread проект C + + бібліотеки thread pool, [13] реалізує однойменний шаблон проектування (Англ.) рос. .


Примітки

  1. Boost Software License - www.boost.org / more / license_info.html
  2. Library Technical Report - www.open-std.org/jtc1/sc22/wg21/docs/library_technical_report.html
  3. Basic Linear Algebra Library - www.boost.org / libs / numeric / ublas / doc / index.htm
  4. uBLAS operations overview - www.boost.org / libs / numeric / ublas / doc / operations_overview.htm
  5. Boost Random Number Library - www.boost.org/libs/random/
  6. Spirit User's Guide - www.boost.org/doc/libs/1_47_0/libs/spirit/doc/html/index.html
  7. Boost.Regex - www.boost.org/doc/libs/1_35_0/libs/regex/doc/html/index.html
  8. Джеремі Сик та ін, 2006
  9. 1 2 The Boost Graph Library (BGL) - www.boost.org/doc/libs/1_37_0/libs/graph/doc/index.html
  10. Boost.Threads API reference - www.boost.org / doc / html / thread.html
  11. Introduction to Boost.Threads - www.ddj.com/dept/cpp/184401518 в Dr.Dobb's Journal. (2002)
  12. What's New in Boost Threads? - www.ddj.com/cpp/211600441 в Dr.Dobb's Journal. (2008)
  13. threadpool library - threadpool.sourceforge.net