感受C++那神奇的boost

include36

·

2020-04-02 17:02:30

·

个人记录

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

boost是什么?

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

boost能干什么

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

字符串和文本处理库

容器库

迭代器库

算法库

函数对象和高阶编程库

泛型编程库

模板元编程

预处理元编程库

并发编程库

数学和数字库

排错和测试库

图像处理库

跨语言混合编程库

内存管理库

解析库

编程接口库

综合类库

编译器问题的变通方案库

是不是很想要!

boost这么好怎么用啊

下载

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

下载后解压即可。

先感受一下

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

你肯定觉得这很简单啊:

#include

using namespace std;

int main()

{

int a,b;

cin>>a>>b;

cout<

return 0;

}

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

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

#include

using namespace std;

#include

using namespace boost::multiprecision;

int main()

{

cpp_int a,b;

cin>>a>>b;

cout<

return 0;

}

很简单吧?

#include

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

#include

using namespace std;

using namespace boost;

int main()

{

mt19937 Rang(time(0));

cout << Rang();

return 0;

}

最小公倍数与最大公因数

#include

#include

using namespace std;

using namespace boost::integer;

int main()

{

cout<::value<<" ";//3与5最小公倍数

cout<::value;//20与15最大公因数

return 0;

}

\pi

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

#include

#include

using namespace std;

int main()

{

using boost::math::constants::pi;

cout<();

return 0;

}

字符串和文本处理库

类型转换

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

#include

#include

using namespace std;

using namespace boost;

int main()

{

try

{

int x = lexical_cast("100");

long y = lexical_cast("2000");

float c = lexical_cast("3.14159");

double d = lexical_cast("2.71828");

cout << x << " " << y << " " << c << " " << d << endl;

string str = lexical_cast(456);

cout << str << endl;

}

catch(bad_lexical_cast& e)

{

cout <<"error:" << e.what() <

}

return 0;

}

try-throw是干什么的?

检测异常,如果lexical_cast("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

#include

using namespace std;

using namespace boost;

int main()

{

format rmat("%d %d\n");

cout << rmat %1 %2;

return 0;

}

个人对boost的感受

优点

库多

好用,香!

缺点

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

部分库对新手不友好

体积较大(600mb),但其中的功能大多可以单独使用。

信奥不支持(白日梦)

结束了?

本文只介绍部分典型的函数及功能,毕竟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别忘了叫我啊。