Aumente as bibliotecas em C++
- Use a biblioteca Boost Multiprecision para conduzir cálculos de alta precisão
- Use Boost Circular Buffer Data Structure como STL Compliant Container
Este artigo demonstrará como utilizar as bibliotecas Boost em C++.
Use a biblioteca Boost Multiprecision para conduzir cálculos de alta precisão
Boost é uma coleção licenciada de código aberto de bibliotecas C++ que fornecem diferentes ferramentas, desde a programação de propósito geral até bibliotecas específicas de domínio, como processamento de imagem ou paralelismo de memória distribuída. Ele contém várias dezenas de bibliotecas individuais, algumas das quais foram incorporadas em versões STL recentes.
Essas bibliotecas são amplamente revisadas por pares e oferecem código confiável e de alta qualidade para qualquer projeto comercial ou de código aberto.
Como há uma grande quantidade de material a ser coberto sobre a biblioteca Boost, mostraremos apenas alguns exemplos de como essas bibliotecas podem ser poderosas. Lembre-se de que as bibliotecas Boost geralmente não são incluídas na maioria dos sistemas operacionais e, muito provavelmente, você terá que instalá-las, caso ainda não tenha feito isso.
Começaremos com a biblioteca Multiprecision
, que traz a capacidade de lidar com cálculos matemáticos de alta precisão. Geralmente, sabemos que os tipos fundamentais de C++ para números têm tamanhos limitados com valores máximos de 64 bits. Mesmo se ignorarmos os números de ponto flutuante, números inteiros grandes que podem ser representados com tipos embutidos atingem o máximo em aproximadamente 1,84 * 10^19
para valores unsigned
. Isso pode ser problemático para muitos aplicativos do mundo real ou até mesmo para o programador que deseja implementar um aplicativo de calculadora útil de alta precisão.
A Biblioteca Multiprecision
fornece diferentes tipos predefinidos de tipos inteiros como int128_t
, int256_t
, int512_t
e int1024_t
, que podem ser usados para armazenar valores integrais de tamanho fixo. Por outro lado, pode-se utilizar o tipo cpp_int
para armazenar inteiros de precisão arbitrária se o usuário não puder saber os limites dos cálculos com antecedência.
O uso básico desses tipos é mostrado no seguinte trecho de código que demonstra a multiplicação dos maiores números representados pelo tipo 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;
}
Produção:
Product of 9223372036854775807 * 9223372036854775807 =
85070591730234615847396907784232501249
Product of 9223372036854775807 * 9223372036854775807 =
85070591730234615847396907784232501249
Use Boost Circular Buffer Data Structure como STL Compliant Container
Outra ferramenta poderosa fornecida pelas bibliotecas Boost é a estrutura de dados do buffer circular implementada como o contêiner compatível com STL. Um buffer circular é semelhante a std::list
e std::deque
, exceto que tem capacidade fixa e a memória correspondente é alocada quando o objeto é construído.
O usuário deve incluir o cabeçalho <boost/circular_buffer.hpp>
e construir um novo objeto com o nome boost::circular_buffer
. Observe que a última é uma classe de modelo e aceita um nome de tipo dos elementos que serão armazenados no buffer. A estrutura de dados também fornece funções de membro push_back
/ push_front
para adicionar elementos às respectivas extremidades do buffer e funções pop_back
/ pop_front
para remover elementos.
Quando o buffer circular é preenchido, os elementos recém-adicionados são sobrescritos desde o início do buffer. O próximo exemplo de código mostra operações comuns no boost::circular_buffer
, enquanto uma descrição detalhada da classe pode ser encontrada aqui.
#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;
}
Produção:
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