boost库介绍以及使用

2023-05-16

C++ boost库介绍以及使用

一. 什么是boost库

​ boost 库是一个优秀的,可移植的,开源的 C++ 库,它是由 C++ 标准委员会发起的,其中一些内容已经成为了下一代 C++ 标准库的内容,在 C++ 社区中影响甚大,是一个不折不扣的准标准库,它的功能十分强大,弥补了 C++ 很多功能函数处理上的不足。

​ 学习链接: https://theboostcpplibraries.com/

​ https://www.cnblogs.com/lidabo/p/9294874.html

​ https://tangxing.blog.csdn.net/article/details/116393985

二. 特点

​ 可移植性:Windows,Linux,Unix 等

​ 开源免费:使用 Boost License 来授权使用,商业和非商业都是可以使用的

​ 高效:具有工业强度,设计结构良好,广泛使用

三. 分类

​ boost 库功能强大,按照功能模块分类,大致可以分为如下:

字符串和文本处理库,容器库,迭代器库,算法库,函数对象和高阶编程库,泛型编程,模板元编程,预处理元编程,并发编程,数字和数学,排错和测试,数据结构,图像处理,输入输出,内存管理,跨语言混合编程,解析,编程接口等。

四.boost库安装

一. CentOS环境下搭建boost开发环境

安装boost库

# yum install boost

# yum install boost-devel

二. 下载boost库及编译

​ 要使用 C++ boost 库,先要下载 boost 库,下载地址是:https://www.boost.org/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0hDUehNp-1680489201384)(watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODEwMjc3MQ==,size_16,color_FFFFFF,t_70.png)]

​ 选择 Downloads 下的 Current Release 就可以下载了。下载完成后查看目录,大致如下结构所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n1c8tmoH-1680489201385)(watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODEwMjc3MQ==,size_16,color_FFFFFF,t_70-16803409982002.png)]

Boost 压缩包解压后有5万多个文件,占据近 700MB 的磁盘空间,但其目录结构却很简洁清晰:

boost_1_72_0/  #存放配置脚本和说明文件
├──── boost    #最重要的目录,90%以上的Boost程序库源码都在这里
├──── doc      #HTML格式的文档,也可以生成PDF格式的文档
├──── libs     #所有组件的示例、测试、编译代码和说明文档
├──── more     #库作者的相关文档
├──── status   #可用于测试Boost库的各个组件
└──── tools    #b2、quickbook 等自带工具

在大多数情况下,我们只需要关心 boost 子目录,这里面以头文件的形式分门别类地存放了我们要使用的库代码:

boost_1_72_0/  #Boost 安装根目录
├──── boost    #boost子目录
│    ├──── accumulators #累加器库
│    ├──── algorithm    #算法库
│    ├──── align        #内存对齐库
│    ├──── archive      #序列化库
│    ├──── asio         #异步并发库
│    ├──── assign       #赋值初始化库
│    ├──── atomic       #原子操作库
│    ├──── beast        #高级网络通信库(HTTP/WebSocket)
│    ├──── bimap        #双向关联数组
│    ├──── bind         #bind表达式
│    ├──── chrono       #时间处理库
│    ├──── ...          #其他库……
│    └──── yap          #表达式模板库

Boost C++ 库的 1.42.0 版本包含了超过90个库,本书只详细讨论了以下各库:

Boost C++ 库简要说明
Boost.AnyBoost.Any 提供了一个名为 boost::any 的数据类型,可以存放任意的类型。 例如,一个类型为 boost::any 的变量可以先存放一个 int 类型的值,然后替换为一个 std::string 类型的字符串。
Boost.ArrayBoost.Array 可以把 C++ 数组视同 C++ 标准的容器。
Boost.AsioBoost.Asio 可用于开发异步处理数据的应用,如网络应用。
Boost.BimapBoost.Bimap 提供了一个名为 boost::bimap 的类,它类似于 std::map. 主要的差别在于 boost::bimap 可以同时从键和值进行搜索。
Boost.BindBoost.Bind 是一种适配器,可以将函数作为模板参数,即使该函数的签名与模板参数不兼容。
Boost.ConversionBoost.Conversion 提供了三个转型操作符,分别执行向下转型、交叉转型,以及不同数字类型间的值转换。
Boost.DateTimeBoost.DateTime 可用于以灵活的格式处理、读入和写出日期及时间值。
Boost.ExceptionBoost.Exception 可以在抛出的异常中加入额外的数据,以便在 catch 处理中提供更多的信息。 这有助于更容易地调试,以及对异常情况更好地作出反应。
Boost.FilesystemBoost.Filesystem 提供了一个类来处理路径信息,还包含了几个访问文件和目录的函数。
Boost.FormatBoost.Format 以一个类型安全且可扩展的 boost::format 类替代了 std::printf() 函数。
Boost.FunctionBoost.Function 简化了函数指针的定义。
Boost.InterprocessBoost.Interprocess 允许多个应用通过共享内存以快速、高效的方式进行通信。
Boost.LambdaBoost.Lambda 可以定义匿名的函数。 代码被内联地声明和执行,避免了单独的函数调用。
Boost.MultiindexBoost.Multiindex 定义了一些新的容器,它们可以同时支持多个接口,如 std::vectorstd::map 的接口。
Boost.NumericConversionBoost.NumericConversion 提供了一个转型操作符,可以安全地在不同的数字类型间进行值转换,不会生成上溢出或下溢出的条件。
Boost.PointerContainerBoost.PointerContainer 提供了专门为动态分配对象进行优化的容器。
Boost.RefBoost.Ref 的适配器可以将不可复制对象的引用传给需要复制的函数。
Boost.RegexBoost.Regex 提供了通过正则表达式进行文本搜索的函数。
Boost.Serialization通过 Boost.Serialization,对象可以被序列化,如保存在文件中,并在以后重新导入。
Boost.SignalsBoost.Signal 是一个事件处理的框架,基于所谓的 signal/slot 概念。 函数与信号相关联并在信号被触发时自动被调用。
Boost.SmartPoinersBoost.SmartPoiners 提供了多个智能指针,简化了动态分配对象的管理。
Boost.SpiritBoost.Spirit 可以用类似于 EBNF (扩展巴科斯范式)的语法生成词法分析器。
Boost.StringAlgorithmsBoost.StringAlgorithms 提供了多个独立的函数,以方便处理字符串。
Boost.SystemBoost.System 提供了一个处理系统相关或应用相关错误代码的框架。
Boost.ThreadBoost.Thread 可用于开发多线程应用。
Boost.TokenizerBoost.Tokenizer 可以对一个字符串的各个组件进行迭代。
Boost.TupleBoost.Tuple 提供了泛化版的 std::pair,可以将任意数量的数据组在一起。
Boost.UnorderedBoost.Unordered 扩展了 C++ 标准的容器,增加了boost::unordered_setboost::unordered_map.
Boost.VariantBoost.Variant 可以定义多个数据类型,类似于 union, 将多个数据类型组在一起。 Boost.Variant 比 union 优胜的地方在于它可以使用类。

linux下编译方式:

$ tar -xzf boost_1_81_0.tar.gz
$ cd boost_1_81_0/
#--with-liraries:需要编译的库 --with-toolset:编译时使用的编译器
$ ./bootstrap.sh --with-libraries=all --with-toolset=gcc
# 默认头文件在/usr/local/include,库文件在/usr/local/lib
$ ./b2 install --prefix=/usr  

五. Boost 使用方式

​ Boost 库的大多数组件不需要编译链接,我们在自己的源码里直接包含头文件即可。例如,如果要使用 boost::tribool,只需要在 C++ 源文件中添加如下 include 语句:

//大多数Boost库仅包含头文件(.hpp):它们完全由包含模板和内联函数的头文件组成;链接时不需要单独编译的库二进制文件或特殊处理。
#include <boost/XXX.hpp>
#include <boost/logic/tribool.hpp> //使用tribool库

细心的读者会发现,Boost 库的头文件与我们平常所用的头文件(*.h)或 C++ 标准库的头文件(没有后缀名)不同,这正是 Boost 的独特之处。它把 C++ 类的声明和实现放在了一个文件中,而不是分成两个文件,即.h+.cpp,故文件的后缀是.hpp

之所以这么做当然是有理由的。其中一个原因就是与普通的C头文件(*.h)区分,另一个很重要的原因就是使 Boost 库不需要预先编译,直接将其引入程序员的工程即可编译链接,方便了 Boost 库的使用。
Java、C#、PHP、Python 程序员应该对这种代码文件形式很熟悉,这几种语言都在一个文件中编写所有代码。

剩下的少量库(如 chrono、date_time、program_options、test、thread 等)必须编译成静态库或动态库,并在构建时指定链接选项才能使用。

大多数的 boost 库仅需要包含头文件 hpp 即可,不需要再链接其他的 lib 文件,但是有些 boost 下的库是需要包含 lib 文件的。

六. 使用案例

#include <iostream>
#include <boost/version.hpp>  //包含 Boost 头文件
#include <boost/config.hpp>  //包含 Boost 头文件
using namespace std;
int main()
{
    cout << BOOST_VERSION << endl;  //Boost 版本号
    cout << BOOST_LIB_VERSION << endl;  //Boost 版本号
    cout << BOOST_PLATFORM << endl;  //操作系统
    cout << BOOST_COMPILER << endl;  //编译器
    cout << BOOST_STDLIB << endl;  //标准库
    return 0;
}

//g++ -o a.out test.cpp
#include <iostream> 
#include <boost/filesystem.hpp> 
 
using namespace boost::filesystem; 
 
int main(int argc, char *argv[]) 
{ 
 if (argc < 2)
 { 
  std::cout << "用法:app path\n"; 
  return 1; 
 } 
 std::cout << argv[1] << ":" << file_size(argv[1]) << std::endl; 
 return 0; 
} 

// 编译命令:g++ demo2.cpp -o demo2  -lboost_system -lboost_filesystem
#include <boost/thread/thread.hpp>
#include <iostream>
 
using namespace std;
 
void NewThread()
{
        cout << "New thread is running..." << endl;
}
 
int main(int argc, char* argv[])
{
        boost::thread newthread(&NewThread);
        newthread.join();
        return 0;
}

// g++ main.cpp -o test -lboost_system -lboost_thread
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost库介绍以及使用 的相关文章

  • libQtCore.so.4 undefined symbol :g_main_context_push_thread_default

    开发板终端执行qt程序 qtDemo qws 报错 xff1a libQtCore so 4 undefined symbol g main context push thread default 解决方案 xff1a cd DVSDK p
  • curl时设置Expect的必要性

    curl 在项目中使用频率较高 xff0c 比如内部接口 第三方 api 图片存储服务等 xff0c 但是我们在使用 curl 时可能并没有注意到 Expect 这个请求头信息 xff0c 而 Expect 设置不正确 xff0c 会导致不
  • 奇偶校验原理

    奇校验 xff1a 求一个字节8位中 1 的个数 xff0c 添加一位校验位 xff0c 使9位中 1 的个数为奇数 xff1b 偶校验同理 奇校验就是让原有数据序列中 xff08 和要加上的一位 xff09 1的个数为奇数 如010001
  • CreateMutex函数函数用来实现进程互斥

    CreateMutex函数 正常情况下 xff0c 一个进程的运行一般是不会影响到其他正在运行的进程的 但是对于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设备的程序运行的 xff0c
  • C++与QML交互总结

    一直对于QT的理解和使用都停留在主窗口程序和控制台程序 xff0c 虽然QT的新东西QML听过也接触过 xff0c 但是基本上没梳理过调用流程 趁着旧项目要使用QML技术 xff0c 现在就将C 43 43 和QML交互进行总结 目录 一
  • QT下TCP协议实现数据网络传输

    QT开发框架以其跨平台的优势 xff0c 在全世界IT界如雷贯耳 其封装了功能齐全的各种类 xff0c 大大的提高了开发者的效率 本篇内容将介绍如何使用QT 6 4 1框架开发服务器和客户端程序 xff0c 让两端能够首发消息 xff0c
  • 从零实现vins-mono+fast-planner+M100无人机实验在现实场景中的应用

    版权声明 本文为博主原创文章 未经博主允许不能随意转载 本文链接 https blog csdn net AnChenliang 1002 article details 109535355 最近由于科研的需要 要将VINS mono与fa
  • Linux下C语言实现HTTP文件服务器和TCP协议实现网络数据传输

    在实际开发中经常用到web框架 xff0c 比如Servlet xff0c SpringBoot等 xff0c 这些开发框架提高了我们的开发效率 xff0c 节省了开发时间 但是这会令我们技术人员处于浮云之上 xff0c 看不到其本质 说实
  • Linux下C语言UDP协议通信实践

    UDP和TCP协议一样 xff0c 都是传输层协议 是无连接的 xff0c 不安全的 xff0c 报式传输层协议 xff0c 通信过程默认也是阻塞的 其通信特点主要如下 xff1a xff08 1 xff09 不需要建立连接 xff0c 所
  • Ubuntu下PyQt5使用总结

    因为工作中需要给交付团队开发桌面工具 xff0c 考虑到交付团队多使用Mac xff0c 调研了一下发现PyQt5可以实现跨平台 xff0c 满足工具开发需要 xff0c 就用其开发了桌面工具 现以ubuntu开发环境为例总结一下开发过程
  • ubuntu下安装配置grpc

    目录 1 准备环境 2 安装protobuf 3 安装cares库 3 安装grpc 1 17 x 1 准备环境 sudo apt get install pkg config sudo apt get install autoconf a
  • cmake管理子程序,lib库和so库应用实践

    cmake在管理大型项目时经常被用到 xff0c 本文以简单程序演示来说明camke管理项目应用 xff0c 其中包括主程序 xff0c 子程序 xff0c so库程序 xff0c lib程序 目录 1 程序目录结构 2 编译执行 3 清除
  • GIt常用命令总结

    目录 1 创建新建分支 2 强制拉去代码 3 合并相邻提交 xff0c 保证只有一个commit信息 4 本地回退 5 查看git修改列表 6 提交代码 7 切换新分支并从服务端拉取最新 8 git cherry pick合并代码使用 9
  • Linux 下I/O多路复用总结

    xfeff xfeff select xff0c poll xff0c epoll都是IO多路复用的机制 I O多路复用就通过一种机制 xff0c 可以监视多个描述符 xff0c 一旦某个描述符就绪 xff08 一般是读就绪或者写就绪 xf
  • WAV文件头分析

    WAV语音文件头部含有44字节的标志信息 xff0c 其含义如下 xff1a ckid xff1a 4字节 RIFF 标志 xff0c 大写 wavHeader 0 61 39 R 39 wavHeader 1 61 39 I 39 wav
  • Linux环境下限制网速和取消限制网速

    查看网卡信息 ip addr root 64 rabbitmq01 ip addr 1 lo lt LOOPBACK UP LOWER UP gt mtu 65536 qdisc noqueue state UNKNOWN qlen 1 l
  • Linux 网络编程2 TCP并发服务器

    Linux 网络编程学习 TCP IP网络编程2 TCP多线程服务器TCP多进程服务器 在前面TCP网络编程代码的基础上进行改造 xff0c 实现并发服务器功能 TCP多线程服务器 实现功能 xff1a server端可以绑定在任意IP端s
  • HTTP Digest authentication

    什么是摘要认证 摘要认证 xff08 Digest authentication xff09 是一个简单的认证机制 xff0c 最初是为HTTP协议开发的 xff0c 因而也常叫做HTTP摘要 xff0c 在RFC2617中描述 其身份验证
  • 简单的netfilter hook函数注册以及内核链表的使用

    include lt linux netfilter h gt include lt linux init h gt include lt linux module h gt include lt linux netfilter ipv4
  • 详述GPS原理及RTK技术应用

    完整的PPT文档在这里 xff1a 详述GPS原理及RTK技术应用 1 GPS概述 1 1定义 全球定位系统GPS xff08 Global Position System xff09 xff0c 全称为NAVSTAR GPS xff08

随机推荐

  • PHP HTTP Digest校验

    PHP作为客户端进行HTTP Digest校验 span class token comment 请求方法 span span class token variable username span span class token oper
  • Http Digest认证协议

    其认证的基本框架为挑战认证的结构 xff0c 如下图所示 xff1a xfeff xfeff 1 客户端希望取到服务器上的某个资源 xff0c 向服务器发送Get请求 2 服务器收到客户端的请求后 xff0c 发现这个资源需要认证信息 xf
  • Postman 安装

    Postman 的下载安装 Postman是一个用于构建和使用API的API平台 xff08 接口的调试工具 xff09 选择对应的系统和版本进行下载 https github com hlmd Postman cn 这里我的电脑是wind
  • 【安卓自定义控件系列】自绘控件打造界面超炫功能超强的圆形进度条

    在前面我们讲过了安卓自定义控件三种方式中的组合控件 xff0c 现在我们来讲解一下通过自绘的方式来实现自定义控件 xff0c 本博客将以自定义圆形进度条为例向大家讲解自定义控件的知识 xff0c 首先来看一下效果图吧 xff0c 这个是本人
  • Linux网络编程3——多进/线程并发服务器

    视频链接 黑马程序员 Linux网络编程 哔哩哔哩 bilibili https www bilibili com video BV1iJ411S7UA p 61 37 目录 一 高并发服务器 1 1 图示 1 2 分类 二 多进程并发服务
  • http请求头和响应头

    文章目录 参考HTTP通用标头Cache ControlConnectionDatePragmaTrailerTransfer EncodingUpgradeViaWarning 请求头AcceptAccept RangesAccept E
  • C++如何使用libcurl发送post请求的三种content-type的封装

    作者 xff1a 虚坏叔叔 博客 xff1a https xuhss com 早餐店不会开到晚上 xff0c 想吃的人早就来了 xff01 x1f604 C 43 43 如何使用libcurl发送post请求的三种content type的
  • 开源四轴飞行器CC3D的稳定模式和PID算法简介

    本文主要介绍一下CC3D的两大飞行模式的原理 xff1a 1 Rate 2 Attitude 以及PID的基本原理 至于AxisLock模式及Manual xff0c 日后续说 笔者是CC3D开源飞控入门玩家 xff0c 遇到过不少磕磕碰碰
  • 了解git分支和版本管理

    0 Git分支和标签的命名规范 1 分支 dev test pre pro 即master 2 标签 Tag格式 xff1a 主版本号 次版本号 修订号 类型标签 xff0c 其中类型标签可为 xff1a alpha beta rc r T
  • ubuntu下解决高并发socket最大连接数限制,tcp默认1024个连接

    nux系统默认ulimit为1024个访问 用户最多可开启的程序数目 一般一个端口 xff08 即一个进程 xff09 的最高连接为2的16次方65536 通过这个命令 ulimit n 可以看到默认值为1024 查看全局文件句柄数限制 系
  • Linux下实现Post方式

    首先了解HTTP协议各字段的含义 xff0c 以下是部分较好的归纳 xff1a HTTP一个HTTP请求报文由请求行 xff08 request line xff09 请求头部 xff08 header xff09 空行和请求数据4个部分组
  • vins中的坐标系变换及g2r函数

    slam中经常会需要表示一个刚体的位姿 例如imu的位姿 xff0c 相机的位姿 首先我们需要在一个刚体上架上一个坐标系 这个坐标系为本体坐标系 怎么架一个坐标系 xff1f imu本身就有规定其本身的x y z轴的方向 相机一般认为 xf
  • yolo_v3安装试运行小记

    github源代码 xff1a https github com qqwweee keras yolo3 Cuda下载地址 xff1a https developer nvidia com cuda toolkit archive Cudn
  • pytorch安装使用

    pytorch官网 xff1a https pytorch org get started locally conda添加清华源 xff1a conda config add channels https mirrors tuna tsin
  • ORB_SLAM3初试

    源码地址 xff1a orb salm3 github 论文地址 orb slam3 paper ORB SLAM3提供了单目 xff0c 双目 xff0c rgbd 以及各自结合IMU的数据分析实现 demo运行效果展示 xff1a 在不
  • vins-fusion代码解读[五] imu在vins里的理解

    SLAM新手 xff0c 欢迎讨论 IMU作用 vins中 xff0c IMU只读取IMU六轴的信息 xff0c 3轴线加速度 xff08 加速度计 xff09 和3轴角速度 xff08 陀螺仪 xff09 通过对陀螺仪的一次积分 xff0
  • Gazebo仿真学习——2.为Gazebo中的机器人添加实用插件

    Gazebo plugins in ROS 1 要了解2 插件类型3 添加一个ModelPlugin4 添加一个SensorPlugin5 gazebo plugins中的所有可用插件5 1 Camera5 2 GPU Laser xff0
  • 一款直播电视接口分析

    一 初步了解 最近对一款网络电视app进行分析 xff0c 要求是找到其访问直播源的接口 xff0c 初次打开apk xff0c 先做一个简单的了解 xff0c 并没有加固等处理 xff0c 只是对代码做了混淆处理 我们目的是找到其访问直播
  • android串口通讯

    一 配置 1 下载文件 https github com cepr android serialport api 2 复制android serialport api文件夹至app src main java 3 复制jni文件至app s
  • boost库介绍以及使用

    C 43 43 boost库介绍以及使用 一 什么是boost库 boost 库是一个优秀的 xff0c 可移植的 xff0c 开源的 C 43 43 库 xff0c 它是由 C 43 43 标准委员会发起的 xff0c 其中一些内容已经成