Bibliothèques Boost en C++
- Utiliser la bibliothèque Boost Multiprecision pour effectuer des calculs de haute précision
- Utiliser la structure de données du tampon circulaire Boost en tant que conteneur conforme STL
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;
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