Boost – kolekcja bibliotek programistycznych poszerzających możliwości języka C++, objętych liberalną licencją Boost Software License.

Pakiet Boost dostarcza m.in. biblioteki ogólnego przeznaczenia (inteligentne wskaźniki, wyrażenia regularne), biblioteki stanowiące warstwę abstrakcji dla systemu operacyjnego (obsługa systemów plików czy wielowątkowości), narzędzia przeznaczone głównie dla innych twórców bibliotek i programistów języka C++ (np. biblioteka metaprogramowania MPL). Kilka bibliotek wchodzących w poczet Boost zostało włączonych do pierwszego raportu technicznego komitetu standaryzacyjnego C++ (w jego skład wchodzi wielu spośród twórców Boost). W Boost wykorzystywane jest programowanie z użyciem szablonów.

Biblioteki edytuj

Boost zapewnia biblioteki poszerzające możliwości języka C++ w następujących dziedzinach:

  • Algorytmy
    • foreach – BOOST_FOREACH makro dla iteracji elementów sekwencyjnych, od: Eric Niebler.
    • graph – Ogólne komponenty i algorytmy dla grafów, od Jeremy Siek oraz grupy z University of Notre Dame.
    • minmax – standardowe rozszerzenie biblioteki dla jednoczesnego obliczania min/max i min/max elementu, od Hervé Brönnimann.
    • range – Nowa infrastruktura generic algorithms będąca efektem nowej koncepcji iteratora, od Thorsten Ottosen.
    • string_algo – Biblioteka algorytmów pracujących na łańcuchach, od Pavol Droba.
    • utility – Szablon funkcji klas next(), prior(), od Dave Abrahams i innych.
  • Programowanie współbieżne
    • asio – Przenośne sieci i inne interfejsy I/O niskiego poziomu, w tym: sockets, timers, hostname resolution, socket iostreams, serial ports, file descriptors oraz Windows HANDLEs, od Chris Kohlhoff.
    • interprocess – pamięć współdzielona, pliki mapowania pamięci, współdzielenie między-procesowe mutexes, zmienne warunkowe, kontenery i wskaźniki, od Ion Gaztañaga.
    • MPI – biblioteka Message Passing Interface, do użytku przy programowaniu aplikacji obliczeń równoległych typu distributed-memory, od Douglas Gregor i Matthias Troyer.
    • thread – Przenośny C++ multi-threading, od William Kempf.
  • Kontenery
    • array – struktura kontenera (STL compliant container wrapper) dla tablic o stałym rozmiarze, od Nicolai Josuttis.
    • bimap – Mapowanie dwukierunkowe (maps), od Matias Capeletto.
    • circular_buffer – kontener STL znany również jako bufor cykliczny, od Jan Gaspar.
    • dynamic_bitset – Wersja dynamicznie zmienna std::bitset od Jeremy Siek i Chuck Allison.
    • graph – Ogólne komponenty i algorytmy dla grafów, od Jeremy Siek oraz grupy University of Notre Dame.
    • intrusive – Intrusywne contenery i algorytmy, od Ion Gaztañaga.
    • multi_array – Adaptery i Kontenery wielowymiarowe dla tablic przyległych danych, od Ron Garcia.
    • multi_index – Kontenery z wielokrotnym interfejsem dostępu kompatybilnego z STL, od Joaquín M López Muñoz.
    • pointer container – Kontenery do zapisu pamięci dynamicznie alokowanej (heap – dla ułatwienia programowania zorientowanego obiektowo, od Thorsten Ottosen.
    • property map – Interfejsy definiowania koncepcyjnego mapujące obiekty kluczy z obiektami wartości, od Jeremy Siek.
    • unordered – nieuporządkowane kontenery asocjacyjne, od Daniel James.
    • variant – Bezpieczny, ogólny, bazujący na stosie stack-based kontener z wariantami, od Eric Friedman i Itay Maman.
  • Sprawdzanie poprawności i testowanie
    • concept check – Ogólne narzędzie programowania, od Jeremy Siek.
    • static_assert – Statyczna asercja (asercja podczas kompilacji), od John Maddock.
    • test – Wsparcie dla prostych testów programu, testów full unit oraz monitorowania pracy programu, od Gennadiy Rozental.
  • Struktury danych
    • any – Bezpieczny, ogólny kontener dla pojedynczych wartości różnych typów, od Kevlin Henney.
    • bimap – Dwukierunkowe mapy, od Matias Capeletto.
    • compressed_pair – Optymalizacja pustego elementu, od John Maddock, Howard Hinnant i innych.
    • fusion – Biblioteka przeznaczona do pracy z TUPLES, z różnymi kontenerami, algorytmami itp. Od Joel de Guzman, Dan Marsden i Tobias Schwinger.
    • multi_index – Kontenery z STL-kompatybilnym interfejsem wielodostępowym, od Joaquín M López Muñoz.
    • pointer container – Kontener do zapisu dynamicznie alokowanych obiektów polimorficznych, ułatwiający programowanie zorientowane obiektowo, od Thorsten Ottosen.
    • property tree – Drzewiasta struktura danych przeznaczona do przechowywania danych konfiguracyjnych, od Marcin Kalicinski i Sebastian Redl.
    • tuple – Proste definicje funkcji zwracających dane złożone itp., od Jaakko Järvi.
    • uuid – Universally Unique Identifiers, od Andy Tompkins.
    • variant – Stabilny, ogólny, bazujący na stosie kontener wariantowy, od Eric Friedman i Itay Maman.
  • Obiekty funkcyjne i programowanie wyższego poziomu
  • Programowanie uogólnione
  • Grafy
  • Wejście/wyjście
  • Wspomaganie dla łączenia z programami napisanymi w języku Python
  • Iteratory
  • Matematyka i obliczenia numeryczne
  • Zarządzanie pamięcią
  • Parsery
  • Metaprogramowanie za pomocą preprocesora
  • Inteligentne wskaźniki z automatycznym zliczaniem referencji
  • Łańcuchy znaków i przetwarzanie tekstów
  • Metaprogramowanie z użyciem szablonów
  • Obejścia nieprawidłowego działania wadliwych kompilatorów

Algebra liniowa edytuj

Boost zawiera bibliotekę algebry liniowej o nazwie uBLAS, która ułatwia wykonywanie operacji na wektorach i macierzach.

  • Przykład pokazujący sposób, w jaki mnoży się wektor przez macierz:
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

using namespace boost::numeric::ublas;

/* przykład mnożenia "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;
}

Generowanie liczb losowych edytuj

Boost zawiera kilka generatorów liczb pseudolosowych, wraz z narzędziami umożliwiającymi uzyskanie wielu rozkładów danych.

#include <boost/random.hpp>
#include <ctime>

using namespace boost;

double SampleNormal (double mean, double sigma)
{
    // wybór generatora liczb
    mt19937 rng;
    // zadanie jako ziarna generatora liczby sekund od roku 1970
    rng.seed(static_cast<unsigned> (std::time(0)));

    // wybór pożądanego rozkładu
    normal_distribution<double> norm_dist(mean, sigma);

    // złączenie generatora i rozkładu przez obiekt funkcyjny
    variate_generator<mt19937&, normal_distribution<double> >  normal_sampler(rng, norm_dist);

    // próbka rozkładu
    return normal_sampler();
}

Wielowątkowość edytuj

Biblioteka Boost.Thread zapewnia możliwość programowania współbieżnego w jednolity sposób w różnych systemach operacyjnych. Ceną za uniwersalny charakter biblioteki jest ograniczona funkcjonalność w stosunku do dedykowanych rozwiązań dla systemów posiksowych jak i windowsowych.

  • Przykładowy kod demonstrujący tworzenie wątków:
#include <boost/thread/thread.hpp>
#include <iostream>
using namespace std; 

void hello_world() 
{
  cout << "Witaj świecie, jestem wątkiem!" << endl;
}

int main(int argc, char* argv[]) 
{
  // utwórz nowy wątek wywołujący funkcję "hello_world"
  boost::thread my_thread(&hello_world);
  // poczekaj na zakończenie wątku
  my_thread.join();
  
  return 0;
}

Linki zewnętrzne edytuj