Bibliotecas Boost en C++

Jinku Hu 12 octubre 2023
  1. Utilice la biblioteca de multiprecisión de Boost para realizar cálculos de alta precisión
  2. Utilice la estructura de datos de búfer circular de Boost como contenedor compatible con STL
Bibliotecas Boost en C++

Este artículo demostrará cómo utilizar las bibliotecas de Boost en C++.

Utilice la biblioteca de multiprecisión de Boost para realizar cálculos de alta precisión

Boost es una colección con licencia de código abierto de bibliotecas de C++ que proporcionan diferentes herramientas que van desde la programación de propósito general hasta bibliotecas específicas de dominio como el procesamiento de imágenes o el paralelismo de memoria distribuida. Contiene varias docenas de bibliotecas individuales, algunas de las cuales se han incorporado a versiones STL recientes.

Estas bibliotecas son revisadas exhaustivamente por pares y ofrecen código confiable y de alta calidad para cualquier proyecto comercial o de código abierto.

Dado que hay una gran cantidad de material que cubrir sobre la biblioteca de Boost, solo mostraremos algunos ejemplos de cuán poderosas pueden ser estas bibliotecas. Tenga en cuenta que las bibliotecas de Boost no suelen estar incluidas en la mayoría de los sistemas operativos, y lo más probable es que tenga que instalarlas si no lo ha hecho en el pasado.

Comenzaremos con la biblioteca Multiprecision, que brinda la capacidad de manejar cálculos matemáticos de alta precisión. Generalmente, sabemos que los tipos fundamentales de C++ para números tienen tamaños limitados con valores máximos de 64 bits. Incluso si ignoramos los números de punto flotante, los enteros grandes que se pueden representar con tipos incorporados alcanzan un máximo de aproximadamente 1,84 * 10^19 para valores unsigned. Esto puede ser problemático para muchas aplicaciones del mundo real o incluso para el programador que desea implementar una aplicación útil de calculadora de alta precisión.

La biblioteca Multiprecision proporciona diferentes tipos predefinidos de tipos enteros como int128_t, int256_t, int512_t e int1024_t, que se pueden utilizar para almacenar valores integrales de tamaño fijo. Por otro lado, se puede utilizar el tipo cpp_int para almacenar enteros de precisión arbitrarios si el usuario no puede conocer los límites de los cálculos de antemano.

El uso básico de estos tipos se muestra en el siguiente fragmento de código que demuestra la multiplicación de los números más grandes representados por el 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;
}

Producción :

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

Utilice la estructura de datos de búfer circular de Boost como contenedor compatible con STL

Otra poderosa herramienta proporcionada por las bibliotecas Boost es la estructura de datos de búfer circular implementada como contenedor compatible con STL. Un búfer circular es similar a std::list y std::deque, excepto que tiene una capacidad fija y la memoria correspondiente se asigna cuando se construye el objeto.

El usuario debe incluir el encabezado <boost/circular_buffer.hpp> y construir un nuevo objeto con el nombre boost::circular_buffer. Tenga en cuenta que esta última es una clase de plantilla y acepta un nombre de tipo de los elementos que se almacenarán en el búfer. La estructura de datos también proporciona funciones miembro push_back / push_front para agregar elementos a los extremos respectivos del búfer y funciones pop_back / pop_front para eliminar elementos.

Cuando se llena el búfer circular, los elementos recién agregados se sobrescriben desde el inicio del búfer. El siguiente ejemplo de código muestra operaciones comunes en boost::circular_buffer, mientras que se puede encontrar una descripción detallada de la clase aquí.

#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;
}

Producción :

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;
Autor: 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

Artículo relacionado - C++ Boost