感受C++那神奇的boost

· · 个人记录

(本文所有代码已测试能用)

boost是什么?

Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称。

boost能干什么

先看看boost有哪些种类的库:

是不是很想要!

boost这么好怎么用啊

下载

打开官网,按图所示下载压缩包。

下载后解压即可。

先感受一下

现在做一个程序,输入两个整数,输出他们的和。

你肯定觉得这很简单啊:

#include <iostream>
using namespace std;

int main()
{
    int a,b;
    cin>>a>>b;
    cout<<a+b;
    return 0;
}

等等,我还没说数据范围……

很显然,这是一个高精题,收回你的高精板子,我们来看看用了boost会是什么样?

#include<iostream>
using namespace std;
#include <boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;

int main()
{
    cpp_int a,b; 
    cin>>a>>b;
    cout<<a+b;
    return 0;
}

很简单吧?

#include <boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;

这两句用来导入和使用所需的文件,而cpp_int则是boost中的整数类型。

boost/multiprecision/表示它在这个文件夹下,你可以找到它并打开(废话)。

但如果你把你把它交到洛谷上,你会得到黄色的CE和红色的0

(这样更好看。)

安装&编译

boost中大多数库只包含头文件,可以直接使用,在编译时直接导入boost所在目录即可,即在g++指令时加上boost目录,如:

g++ x:\a.cpp -o x:\a.exe -I X:\mingw_boost\boost_1_72_0

如果你用的是DEV-C++或类似的IDE,则可以在编译选项中直接添加。

终端编译效果:

┌────────────────────────────────────────────────────────────┐
│Command Prompt                                        - □ x │
├────────────────────────────────────────────────────────────┤
│Microsoft Windows [Version 10.0.0]                          │
│(c) 2020 Microsoft Corporation. All rights reserved.        │
│                                                            │
│C:\>g++ x:\a.cpp -o x:\a.exe -I X:\mingw_boost\boost_1_72_0 │
│                                                            │
│C:\>x:\a.exe                                                │
│123 456                                                     │
│579                                                         │
│C:\>                                                        │
│                                                            │
└────────────────────────────────────────────────────────────┘

大多数库只包含头文件,也就是说有一些库需要编译。 (其实一般那大部分已经够用了)

为了在 Boost Jam 的帮助下自动安装,要使用一个名为 bjam 的应用程序,它也带有源代码。 对于某些操作系统,包括 Windows 和 Linux,也有预编译好的 bjam 二进制文件。为了编译 bjam 本身,要执行一个名为 build 的简单脚本,它也为不同的操作系统提供了源代码。 对于 Windows,它是批处理文件 build.bat。 对于 Linux,文件名为 build. sh。

如果执行 build 时不带任何命令行选项,则该脚本尝试找到一个合适的编译器来生成 bjam。 通过使用命令行开关,称为 toolset,可以选择特定的编译器。 对于 Windows,build 支持 toolsets vc7, vc8 和 vc9,可以选择不同版本的 Microsoft C++ 编译器。 要从 Visual Studio 2008 的C++编译器编译 bjam,需要指定命令 build vc9。对于 Linux,支持 toolsets gcc 和 intel-linux,分别选定 GCC 和 Intel 的C++编译器。

应用程序 bjam 必须复制到本地的 Boost 目录 - 不论它是编译出来的还是下载的预编译二进制文件。 然后就可以不带任何命令行选项地执行 bjam,编译并安装 Boost C++ 库。

接下来我们正式开始使用boost。

数学和数字库

刚刚我们已经见识到了boost的高精度,现在来看看有关数学的其他东西。

(不想写高精度,就用boost)

随机数

boost中用mt19937 Rand(time(0));来初始化一个随机数种子,用Rand()产生一个随机数。

Rand可以替换成其他的,比如rad等。

#include <iostream>
#include <boost/random.hpp>
using namespace std;
using namespace boost;

int main()
{
    mt19937 Rang(time(0));
    cout << Rang();
    return 0;
}

最小公倍数与最大公因数

#include <iostream>
#include <boost/integer/common_factor_ct.hpp>
using namespace std;
using namespace boost::integer;
int main()
{
    cout<<static_lcm<5, 3>::value<<" ";//3与5最小公倍数
    cout<<static_gcd<20, 15>::value;//20与15最大公因数
    return 0;
}

\pi

在boost中使用\pi需要先using boost::math::constants::pi;,使用为pi<格式>()

#include <iostream>
#include <boost/math/constants/constants.hpp>
using namespace std;
int main()
{
    using boost::math::constants::pi;
    cout<<pi<double>();
    return 0;
}

字符串和文本处理库

类型转换

lexical_cast<>可以实现不同类型的数据,例如"123"(string)->123(int)

#include <iostream>
#include <boost/lexical_cast.hpp>
using namespace std;
using namespace boost;
int main()
{
    try
    {
        int x = lexical_cast<int>("100");
        long y = lexical_cast<long>("2000");
        float c = lexical_cast<float>("3.14159");
        double d = lexical_cast<double>("2.71828");
        cout << x << " " << y << " " << c << " " << d << endl;

        string str = lexical_cast<string>(456);
        cout << str << endl;
    }
    catch(bad_lexical_cast& e)
    {
        cout <<"error:" << e.what() <<endl;
    }
    return 0;
}

try-throw是干什么的?

检测异常,如果lexical_cast<int>("100ABC");就会出现错误,可以自己试下。

格式转换

boost中用format定义。

什么意思?

在C语言中,printf()函数中%d表示从后面的列表中提取一个项以整数形式输出,例如printf("%d %d\n",1,2)输出1 2,末尾带一个换行符。

format同理。

如下定义rmat时给出的(%d %d\n)printf(%d %d\n)同理。调用时,用%表示参数。

那么以下代码与printf("%d %d",1,2)效果一样,但当重复以一种格式输出多组数据时format更优。

#include <iostream>
#include <boost/format.hpp>
using namespace std;
using namespace boost;

int main()
{
    format rmat("%d %d\n");
    cout << rmat %1 %2;
    return 0;
}

个人对boost的感受

优点

缺点

几乎没有缺点,如果有,那就:

结束了?

本文只介绍部分典型的函数及功能,毕竟600多mb的东西谁一次讲得完。

本文所涉及到的只是boost中很小的一部分,但足以看出boost的强大!

从开头部分可以看到,boost的范围极广,可以说是加强版的STL,非常值得深入学习理解。

boost常用库

Regex

正则表达式库

Spirit

LL parser framework,用C++代码直接表达EBNF

Graph

图组件和算法

Lambda

在调用的地方定义短小匿名的函数对象,很实用的functional功能

concept check

检查泛型编程中的concept

Mpl

用模板实现的元编程框架

Thread

可移植的C++多线程库

Python

把C++类和函数映射到Python之中

Pool

内存池管理

smart_ptr

5个智能指针,学习智能指针必读

更多内容参见boost中文教程与boost官网(本文参考资料)。

下一篇:不想写高精度,就用boost。

如果哪天你谷支持了boost别忘了叫我啊。