C++의 부스트 라이브러리

Jinku Hu 2023년10월12일
  1. Boost Multiprecision 라이브러리를 사용하여 고정밀 계산 수행
  2. STL 호환 컨테이너로 부스트 순환 버퍼 데이터 구조 사용
C++의 부스트 라이브러리

이 기사에서는 C++에서 Boost 라이브러리를 활용하는 방법을 보여줍니다.

Boost Multiprecision 라이브러리를 사용하여 고정밀 계산 수행

Boost는 범용 프로그래밍에서 이미지 처리 또는 분산 메모리 병렬 처리와 같은 도메인 특정 라이브러리에 이르기까지 다양한 도구를 제공하는 C++ 라이브러리의 오픈 소스 라이선스 컬렉션입니다. 여기에는 수십 개의 개별 라이브러리가 포함되어 있으며 그 중 일부는 최신 STL 버전에 통합되었습니다.

이러한 라이브러리는 광범위하게 동료 검토를 거치며 모든 오픈 소스 또는 상용 프로젝트에 대해 고품질의 안정적인 코드를 제공합니다.

Boost 라이브러리에 대해 다루어야 할 자료가 매우 많기 때문에 이러한 라이브러리가 얼마나 강력한지 보여주는 몇 가지 예만 보여드리겠습니다. Boost 라이브러리는 일반적으로 대부분의 운영 체제에 포함되어 있지 않으며 과거에 설치하지 않은 경우 설치해야 합니다.

고정밀 수학 계산을 처리할 수 있는 기능을 제공하는 Multiprecision 라이브러리부터 시작하겠습니다. 일반적으로 숫자에 대한 C++ 기본 유형의 크기는 최대 64비트 값으로 제한됩니다. 부동 소수점 숫자를 무시하더라도 내장 유형으로 표현할 수 있는 큰 정수는 unsigned 값에 대해 대략 1,84 * 10^19가 최대입니다. 이것은 많은 실제 응용 프로그램이나 유용한 고정밀 계산기 앱을 구현하려는 프로그래머에게도 문제가 될 수 있습니다.

Multiprecision 라이브러리는 고정 크기의 정수 값을 저장하는 데 사용할 수 있는 int128_t, int256_t, int512_tint1024_t와 같은 미리 정의된 다양한 정수 유형을 제공합니다. 반면에 사용자가 계산의 한계를 미리 알 수 없는 경우 cpp_int 유형을 사용하여 임의의 정밀도 정수를 저장할 수 있습니다.

이러한 유형의 기본 사용법은 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;
}

출력:

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

STL 호환 컨테이너로 부스트 순환 버퍼 데이터 구조 사용

Boost 라이브러리에서 제공하는 또 다른 강력한 도구는 STL 호환 컨테이너로 구현된 순환 버퍼 데이터 구조입니다. 순환 버퍼는 고정된 용량을 가지고 있고 객체가 생성될 때 해당 메모리가 할당된다는 점을 제외하고 std::liststd::deque와 유사합니다.

사용자는 <boost/circular_buffer.hpp> 헤더를 포함하고 boost::circular_buffer 이름으로 새 개체를 구성해야 합니다. 후자는 템플릿 클래스이며 버퍼에 저장될 요소의 유형 이름을 허용합니다. 데이터 구조는 또한 버퍼의 각 끝에 요소를 추가하는 push_back/push_front 멤버 함수와 요소를 제거하는 pop_back/pop_front 함수를 제공합니다.

순환 버퍼가 채워지면 버퍼의 요청에서 새로 추가된 요소를 덮어씁니다. 다음 코드 예제는 boost::circular_buffer에 대한 일반적인 작업을 보여주며 클래스에 대한 자세한 설명은 여기에서 찾을 수 있습니다.

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

출력:

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;
작가: 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

관련 문장 - C++ Boost