The Boost Template Library
One of the most popular add-on libraries for C++, especially numerical or scientific programming, is Boost. Boost is not included with any compilers, but is generally easy to obtain. For Linux systems generally it is available through the package manager.
Installing Boost
Boost uses its own build system on Unix and macOS. On Windows there is an experimental CMake system but generally the “bjam” builder is still used. In all cases, installing Boost requires some familiarity with using a command line.
Unix and macOS
On a Linux system, the simplest way to install Boost is to utilize the package manager of the distribution. For example on Ubuntu the command is
sudo apt install libboost-all-dev
or on Fedora (or Centos 8 and beyond)
sudo dnf install boost
sudo dnf install boost-devel
If you do not have superuser (sudo) permission, or you wish to install Boost somewhere other than the main system libraries, follow the general
instructions.
The default prefix for installation from b2 install
is /usr/local
. This is true for both Linux and macOS. If you wish to install to /usr/local
, which is normally in the system search paths, you will need to run the installation command with sudo
cd path/to/boost/source
./bootstrap.sh
sudo ./b2 install
If you do not have sudo privileges or you wish to install it someplace else, keep in mind that this will affect how you reference the headers and libraries with -I
and -L
. You must provide the prefix to the installation directory to the bootstrap.sh
script to install someplace other than the default location.
./bootstrap.sh --prefix=/home/mst3k/boost
./b2 install
Windows
Installation on Windows is somewhat more complicated than on Unix variants. First download the zipped source file.
- Start a command window. If you wish to install Boost in a standard search path, you will need to run it as administrator.
- Unzip the .zip file into a folder of your choice
C:\yourpath
. It will unpack to a folder with a version number, which may vary from our exampleC:\yourpath\boost_1_76_0
- Create some folders, e.g. mkdir C:\boost-build mkdir C:\yourpath\boost_1_76_0\boost-build mkdir C:\boost
- From the command prompt, `cd C:\yourpath\boost_1_76_0\tools\build
- Run
boostrap.bat gcc
- Install the build system with
b2 --prefix="C:\boost-build" install
- Modify your session PATH with
set PATH=%PATH%;C:\boost-build\bin
- Return to your source directory
cd C:\yourpath\boost_1_76_0
- Build with
b2 --build-dir="C:\install\boost --prefix="C:\boost" --build-type=complete toolset=gcc install
- This will install to “C:\boost\include\boost-1_76_0” and “C:\boost\lib”
You may remove temporary unpacking and build directories if you wish. You may also move the header files up to C:\boost\include if you prefer. Remember that
<boost/boostheader.hpp>
will use-I
to start looking for that subdirectory.
Using Boost is probably simplest with a Makefile. The
example is for Windows with a particular choice of location for the boost header files and libraries. Change the locations for -I
and -L
as appropriate if they are located elsewhere on your system. Please refer to the earlier
chapter for a review of setting up Makefiles. This example goes with a standard Boost
example.
If you have installed Boost onto a Linux or macOS system to a system default search location such as /usr
or /usr/local
you will not need to specify the -I
or -L
paths at all. The example
makefile assumes installation in system paths in the compiler’s default search paths.
Boost MultiArrays
C-style arrays are widely used but lack some important features, such as the ability to check whether indexes outside the array bounds are referenced. The C++ STL array type has more features, but is limited to one dimension. A workaround is to “stack” vectors, since a vector of a vector amounts to a 2-dimensional structure.
#include <vector>
using namespace std;
vector<vector<double>> A;
The Boost library provides a popular alternative, the MultiArray. This structure can be N-dimensional, its bounds (extents) can be checked, and it can be reshaped and resized. The price is that it can be slow.
#include <iostream>
#include <ctime>
#include <boost/multi_array.hpp>
using namespace std;
int main(int argc, char*argv[])
{
int nrows;
int ncols;
// Iterations are to make the time measurable
const int ITERATIONS = 1000;
time_t startTime,endTime;
// Set the array dimensions
nrows=500;
ncols=500;
// Create the boost array
typedef boost::multi_array<double, 2> Array2D;
Array2D boostArray(boost::extents[nrows][ncols]);
// Create the C array
double **C_Array;
//
//------------------Measure boost----------------------------------------------
startTime= time(NULL);
for (int i = 0; i < ITERATIONS; ++i) {
for (int x = 0; x <nrows; ++x) {
for (int y = 0; y <ncols; ++y) {
boostArray[x][y] = 2.345;
}
}
}
endTime= time(NULL);
cout<<"[Boost] Elapsed time: "<<(endTime-startTime)/1000.0<<" sec\n";
//------------------Measure native---------------------------------------------
C_Array= new double* [nrows];
for (int i=0;i<nrows;++i) {
C_Array[i]=new double[ncols];
}
startTime= time(NULL);
for (int i = 0; i < ITERATIONS; ++i) {
for (int x = 0; x <nrows; ++x) {
for (int y = 0; y <ncols; ++y) {
C_Array[x][y] = 2.345;
}
}
}
endTime= time(NULL);
cout<<"[C style] Elapsed time: "<<(endTime-startTime)/1000.0<<" sec\n";
return 0;
}
Exercise
If you have succeeded in installing Boost, or you have access to a system where it has been installed, download and run the above boost_array.cxx program.