Boost-Bibliotheken in C++
- Verwenden Sie die Boost Multiprecision Library, um hochpräzise Berechnungen durchzuführen
- Verwendung von die Boost Circular Buffer-Datenstruktur als STL-konformen Container
In diesem Artikel wird gezeigt, wie Sie Boost-Bibliotheken in C++ verwenden.
Verwenden Sie die Boost Multiprecision Library, um hochpräzise Berechnungen durchzuführen
Boost ist eine Open-Source-lizensierte Sammlung von C++-Bibliotheken, die verschiedene Tools bereitstellt, angefangen von der allgemeinen Programmierung bis hin zu domänenspezifischen Bibliotheken wie Bildverarbeitung oder Parallelität mit verteiltem Speicher. Es enthält mehrere Dutzend einzelne Bibliotheken, von denen einige in neuere STL-Versionen integriert wurden.
Diese Bibliotheken werden umfassend von Experten begutachtet und bieten qualitativ hochwertigen, zuverlässigen Code für jedes Open-Source- oder kommerzielle Projekt.
Da es über die Boost-Bibliothek eine große Menge an Material zu behandeln gibt, werden wir nur einige Beispiele dafür vorstellen, wie mächtig diese Bibliotheken sein können. Beachten Sie, dass die Boost-Bibliotheken normalerweise nicht auf den meisten Betriebssystemen enthalten sind und Sie sie höchstwahrscheinlich installieren müssen, wenn Sie dies in der Vergangenheit noch nicht getan haben.
Wir beginnen mit der Bibliothek Multiprecision
, die die Möglichkeit bietet, hochpräzise mathematische Berechnungen durchzuführen. Im Allgemeinen wissen wir, dass grundlegende C++-Typen für Zahlen begrenzte Größen mit maximalen 64-Bit-Werten haben. Selbst wenn wir die Gleitkommazahlen ignorieren, können große ganze Zahlen, die mit eingebauten Typen dargestellt werden können, bei etwa 1,84 * 10^19
für unsigned
Werte maximal sein. Dies kann für viele reale Anwendungen problematisch sein oder sogar für den Programmierer, der eine nützliche hochpräzise Taschenrechner-App implementieren möchte.
Die Bibliothek Multiprecision
bietet verschiedene vordefinierte Typen von Integer-Typen wie int128_t
, int256_t
, int512_t
und int1024_t
, die zum Speichern fester Integralwerte verwendet werden können. Andererseits kann man den Typ cpp_int
verwenden, um ganze Zahlen mit beliebiger Genauigkeit zu speichern, wenn der Benutzer die Grenzen der Berechnungen nicht im Voraus kennt.
Die grundlegende Verwendung dieser Typen wird im folgenden Codeausschnitt gezeigt, der die Multiplikation der größten Zahlen veranschaulicht, die durch den Typ long long
repräsentiert werden.
#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;
}
Ausgabe:
Product of 9223372036854775807 * 9223372036854775807 =
85070591730234615847396907784232501249
Product of 9223372036854775807 * 9223372036854775807 =
85070591730234615847396907784232501249
Verwendung von die Boost Circular Buffer-Datenstruktur als STL-konformen Container
Ein weiteres leistungsstarkes Werkzeug der Boost-Bibliotheken ist die Ringpuffer-Datenstruktur, die als STL-konformer Container implementiert ist. Ein Ringpuffer ähnelt std::list
und std::deque
, hat jedoch eine feste Kapazität und der entsprechende Speicher wird beim Erstellen des Objekts zugewiesen.
Der Benutzer sollte den Header <boost/circular_buffer.hpp>
einfügen und ein neues Objekt mit dem Namen boost::circular_buffer
erstellen. Beachten Sie, dass letztere eine Vorlagenklasse ist und einen Typnamen der Elemente akzeptiert, die im Puffer gespeichert werden. Die Datenstruktur bietet auch push_back
/push_front
-Elementfunktionen zum Hinzufügen von Elementen zu den jeweiligen Enden des Puffers und pop_back
/pop_front
-Funktionen zum Entfernen von Elementen.
Wenn der Ringpuffer gefüllt ist, werden neu hinzugefügte Elemente vom Anfang des Puffers überschrieben. Das nächste Codebeispiel zeigt gängige Operationen auf dem boost::circular_buffer
, während eine detaillierte Beschreibung der Klasse hier zu finden ist.
#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;
}
Ausgabe:
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