感受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中使用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的感受
优点
- 库多
- 好用,香!
缺点
几乎没有缺点,如果有,那就:
- 部分库对新手不友好
- 体积较大(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别忘了叫我啊。