Bibliothèques Boost en C++

Jinku Hu 12 octobre 2023
  1. Utiliser la bibliothèque Boost Multiprecision pour effectuer des calculs de haute précision
  2. Utiliser la structure de données du tampon circulaire Boost en tant que conteneur conforme STL
Bibliothèques Boost en C++

Cet article montrera comment utiliser les bibliothèques Boost en C++.

Utiliser la bibliothèque Boost Multiprecision pour effectuer des calculs de haute précision

Boost est une collection sous licence open source de bibliothèques C++ qui fournissent différents outils allant de la programmation à usage général aux bibliothèques spécifiques à un domaine comme le traitement d’images ou le parallélisme à mémoire distribuée. Il contient plusieurs dizaines de bibliothèques individuelles, dont certaines ont été incorporées dans des versions STL récentes.

Ces bibliothèques sont largement évaluées par des pairs et elles offrent un code fiable et de haute qualité pour tout projet open source ou commercial.

Puisqu’il y a une énorme quantité de matériel à couvrir sur la bibliothèque Boost, nous ne présenterons que quelques exemples de la puissance de ces bibliothèques. N’oubliez pas que les bibliothèques Boost ne sont généralement pas incluses sur la plupart des systèmes d’exploitation, et très probablement, vous devrez l’installer si vous ne l’avez pas fait dans le passé.

Nous commencerons par la bibliothèque Multiprecision, qui apporte la possibilité de gérer des calculs mathématiques de haute précision. Généralement, nous savons que les types fondamentaux C++ pour les nombres ont des tailles limitées avec des valeurs maximales de 64 bits. Même si nous ignorons les nombres à virgule flottante, les grands entiers pouvant être représentés avec des types intégrés atteignent un maximum d’environ 1,84 * 10^19 pour les valeurs unsigned. Cela peut être problématique pour de nombreuses applications du monde réel ou même pour le programmeur qui souhaite implémenter une application de calculatrice de haute précision utile.

La bibliothèque Multiprecision fournit différents types de types entiers prédéfinis tels que int128_t, int256_t, int512_t et int1024_t, qui peuvent être utilisés pour stocker des valeurs entières de taille fixe. En revanche, on peut utiliser le type cpp_int pour stocker des entiers de précision arbitraire si l’utilisateur ne peut pas connaître à l’avance les limites des calculs.

L’utilisation de base de ces types est illustrée dans l’extrait de code suivant qui montre la multiplication des plus grands nombres représentés par le type long long.

#include <boost/multiprecision/cpp_int.hpp>

using std::cout;
using std::endl;
using namespace boost::multiprecision;

int128_t Multiply(long long A, long long B) {
  int128_t ans = (int128_t)A * B;
  return ans;
}

cpp_int Multiply2(long long A, long long B) {
  cpp_int ans = (cpp_int)A * B;
  return ans;
}

int main() {
  long long first = 9223372036854775807;
  long long second = 9223372036854775807;

  cout << "Product of " << first << " * " << second << " = \n"
       << Multiply(first, second) << endl;

  cout << "Product of " << first << " * " << second << " = \n"
       << Multiply2(first, second) << endl;

  return EXIT_SUCCESS;
}

Production:

Product of 9223372036854775807 * 9223372036854775807 =
85070591730234615847396907784232501249
Product of 9223372036854775807 * 9223372036854775807 =
85070591730234615847396907784232501249

Utiliser la structure de données du tampon circulaire Boost en tant que conteneur conforme STL

Un autre outil puissant fourni par les bibliothèques Boost est la structure de données de tampon circulaire implémentée en tant que conteneur conforme STL. Un tampon circulaire est similaire à std::list et std::deque, sauf qu’il a une capacité fixe et que la mémoire correspondante est allouée lors de la construction de l’objet.

L’utilisateur doit inclure l’en-tête <boost/circular_buffer.hpp> et construire un nouvel objet avec le nom boost::circular_buffer. A noter que cette dernière est une classe template et accepte un nom de type des éléments qui seront stockés dans le buffer. La structure de données fournit également des fonctions membres push_back/push_front pour ajouter des éléments aux extrémités respectives du tampon et des fonctions pop_back/pop_front pour supprimer des éléments.

Lorsque le tampon circulaire est rempli, les éléments nouvellement ajoutés sont écrasés depuis le début du tampon. L’exemple de code suivant montre les opérations courantes sur le boost::circular_buffer, tandis qu’une description détaillée de la classe peut être trouvée ici.

#include <boost/circular_buffer.hpp>
#include <boost/multiprecision/cpp_int.hpp>

using std::cout;
using std::endl;

template <typename T>
void printBuffer(boost::circular_buffer<T> cbuf) {
  for (const auto &item : cbuf) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  boost::circular_buffer<int> cb(10);

  for (int i = 0; i < 10; ++i) {
    cb.push_back(i);
  }
  printBuffer(cb);

  cout << "cb.back: " << cb.back() << endl;
  cout << "cb.front: " << cb.front() << endl;

  for (int i = 0; i < 5; ++i) {
    cb.push_front(i);
  }
  printBuffer(cb);

  cout << "cb.back: " << cb.back() << endl;
  cout << "cb.front: " << cb.front() << endl;

  cb.pop_back();
  printBuffer(cb);

  cb.pop_front();
  printBuffer(cb);

  return EXIT_SUCCESS;
}

Production:

0; 1; 2; 3; 4; 5; 6; 7; 8; 9;
cb.back: 9
cb.front: 0
4; 3; 2; 1; 0; 0; 1; 2; 3; 4;
cb.back: 4
cb.front: 4
4; 3; 2; 1; 0; 0; 1; 2; 3;
3; 2; 1; 0; 0; 1; 2; 3;
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ Boost