当前位置: 首页 > news >正文

【C++】开源:Boost库常用组件配置使用

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍Boost库常用组件配置使用。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
      • Boost.Thread特性
      • Boost.Serialization特性
      • Boost.Math特性
      • Boost.Time特性
    • :blush:2. 环境配置
    • :satisfied:3. 使用说明
      • Boost.Thread使用示例
      • Boost.Serialization使用示例
      • Boost.Math使用示例
      • Boost.Time使用示例

😏1. 项目介绍

项目Github地址:https://github.com/boostorg/boost

Boost是一个流行的、开源的C++库集合,提供了各种功能强大的库和工具,扩展了C++语言的能力,并为开发者提供了更高级别的抽象和工具。Boost库经过广泛的使用和测试,被认为是C++社区的事实标准之一。

Boost库包含了多个模块,每个模块都提供了不同领域的功能和工具,覆盖了诸如字符串操作、数据结构、算法、日期时间处理、文件系统、线程、网络、正则表达式等各个方面。以下是一些常用的Boost库:

1.Boost.Asio:提供了异步I/O操作的网络编程库,支持TCP、UDP、串口等网络协议。

2.Boost.Smart_Ptr:提供了智能指针类,如shared_ptr和weak_ptr,用于方便地进行内存管理。

3.Boost.Filesystem:提供了对文件系统的访问和操作,包括文件和目录的创建、删除、遍历等。

4.Boost.Regex:提供了正则表达式的功能,用于进行文本匹配和搜索操作。

5.Boost.Thread:提供了跨平台的多线程编程接口,简化了线程的创建、同步和通信等操作。

6.Boost.Serialization:提供了对象的序列化和反序列化功能,可以将对象以二进制或XML格式进行存储和传输。

除了以上列举的库之外,Boost还包含了许多其他功能丰富的库,如Boost.Math用于数学计算、Boost.Graph用于图论算法、Boost.Test用于单元测试等。Boost库通常以头文件方式提供,使用Boost只需包含相应的头文件,并链接对应的库文件。

Boost库的目标是提供高质量和高可移植性的C++代码,因此它的代码质量很高,并且支持各种主流操作系统和编译器。Boost库的开发是一个开放的社区驱动过程,接受用户的反馈和贡献,并定期发布新版本。

Boost.Thread特性

线程管理:Boost.Thread可以创建、启动、停止和管理线程。它提供了线程对象(boost::thread)来表示一个线程,并提供了一些类似于启动线程、等待线程结束、检查线程状态等方法。

互斥锁和条件变量:Boost.Thread 提供了互斥锁和条件变量等同步原语,用于实现线程之间的互斥和同步。互斥锁可以保护共享资源的访问,条件变量可以实现线程之间的等待和通知机制。

线程间数据共享:Boost.Thread提供了一些线程间数据共享的机制,如原子操作、线程局部存储等,可以保证在多线程环境下的数据访问的正确性和一致性。

线程间通信:Boost.Thread 还提供了一些线程间通信的机制,如消息队列、信号量等,可以实现线程之间的信息传递和同步。

并发算法:Boost.Thread 还提供了一些并发算法,如并行循环(parallel loop)、并行排序(parallel sort)等,可以在多核处理器上有效地执行并行计算任务。

Boost.Serialization特性

序列化:Boost.Serialization 可以将对象序列化为字节流。通过使用 boost::serialization 命名空间中的 << 运算符,您可以将对象写入输出流中。
反序列化:Boost.Serialization 可以从字节流反序列化对象。通过使用 boost::serialization 命名空间中的 >> 运算符,您可以从输入流中读取字节并重建对象。
版本控制:Boost.Serialization 支持版本控制,可以在不同版本之间进行对象的序列化和反序列化。这使得改变对象的结构时可以进行向前和向后兼容。
对象关联:Boost.Serialization 能够正确地处理对象之间的关联关系和引用。当序列化一个对象时,被引用的对象也会被自动序列化,并在反序列化时进行恢复。
自定义扩展:Boost.Serialization 允许开发者对自定义类型进行扩展和适配,以支持序列化和反序列化操作。通过为自定义类型添加 serialize 函数,可以指定如何将对象转换为字节流和从字节流中恢复。

Boost.Math特性

数字运算:Boost.Math 提供了大量的数学函数,例如幂函数、指数函数、对数函数、三角函数、双曲函数等。这些函数支持各种数据类型,包括整数、浮点数和复数,并且具有高精度和高效率。
特殊函数:Boost.Math 实现了许多特殊函数,如伽玛函数、贝塞尔函数、椭圆积分、误差函数和球贝塞尔函数等。这些函数在科学计算、信号处理、概率统计和物理建模等领域中具有广泛的应用。
数值常量:Boost.Math 提供了许多常用的数学常量,如圆周率 π、自然对数底 e、黄金比例 φ 等。这些常量可以直接在代码中使用,而无需手动输入。
概率分布:Boost.Math 实现了各种概率分布函数和随机数生成器,如正态分布、均匀分布、泊松分布和二项分布等。这些函数和生成器可用于模拟实验、数据分析和统计推断等应用场景。
统计算法:Boost.Math 包含一些统计计算的算法,如平均值、标准差、方差、协方差和相关系数等。这些算法可以用于描述和分析数据集的统计特性。
几何计算:Boost.Math 提供了一些用于几何计算的函数和类,如点、向量、矩阵、线段、射线和多边形等。这些工具可以用于解决几何问题,如交点计算、距离计算和形状检测等。

Boost.Time特性

boost::posix_time:提供了对时间点和时间间隔进行操作的类和函数。它支持高精度的时间表示,并提供了各种算术和比较运算符,以及格式化和解析时间的能力。
boost::gregorian:提供了对 Gregorian 阳历日期进行操作的类和函数。它支持日期的算术和比较运算符,以及格式化和解析日期的能力。它还提供了一些有用的函数,如计算某个日期的下一个工作日、计算某个月份的天数等。
boost::date_time:提供了一个更高级的日期和时间处理框架,可以处理多种不同的日历系统、时区和时间精度。它建立在 boost::posix_time 和 boost::gregorian 的基础上,提供了更丰富的功能。例如,它支持多种不同的日历系统,如 Julian 日历、季节日历等;支持多种不同的时区表示和转换;还提供了更复杂的日期和时间算法,如计算某个日期之前或之后的工作日,计算某个日期所在的周是当年的第几周等。

😊2. 环境配置

下面进行环境配置:

# apt安装
sudo apt-get install libboost-dev

😆3. 使用说明

下面进行使用分析:

Boost.Thread使用示例

创建线程示例:

#include <iostream>
#include <boost/thread.hpp>// 线程函数
void threadFunction()
{// 输出线程相关信息std::cout << "Thread ID: " << boost::this_thread::get_id() << std::endl;std::cout << "Hello from a thread!" << std::endl;
}int main()
{// 创建线程并启动boost::thread threadObj(threadFunction);// 多个线程类似// 等待线程结束threadObj.join();// 输出主线程相关信息std::cout << "Thread ID: " << boost::this_thread::get_id() << std::endl;std::cout << "Main thread exiting..." << std::endl;return 0;
}

编译运行:

g++ -o main main.cpp -lboost_thread -lpthread
./main
Thread ID: 7f65d8552700
Hello from a thread!
Thread ID: 7f65d8553740
Main thread exiting...

Boost.Serialization使用示例

#include <iostream>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>// 要进行序列化和反序列化的示例类
class MyClass
{
public:int data;double d;std::string str;// 声明 Boost 序列化函数为友元函数friend class boost::serialization::access;// Boost 序列化函数(将对象转换为字节流)template<class Archive>void serialize(Archive & ar, const unsigned int version){ar & data;ar & d;ar & str;}
};int main()
{// 创建一个 MyClass 对象并设置数据MyClass obj;obj.data = 42;obj.d = 1.005;obj.str = "hello";// 将对象序列化到文件std::ofstream outputFile("data.txt");boost::archive::text_oarchive outputArchive(outputFile);outputArchive << obj;outputFile.close();// 从文件中反序列化对象std::ifstream inputFile("data.txt");boost::archive::text_iarchive inputArchive(inputFile);MyClass restoredObj;inputArchive >> restoredObj;inputFile.close();// 输出反序列化后的对象数据std::cout << "Restored data: " << restoredObj.data << std::endl;std::cout << "Restored d: " << restoredObj.d << std::endl;std::cout << "Restored str: " << restoredObj.str << std::endl;return 0;
}

编译运行:

g++ -o main main.cpp -lboost_serialization && ./main
Restored data: 42
Restored d: 1.005
Restored str: hello

Boost.Math使用示例

#include <iostream>
#include <boost/math/constants/constants.hpp>
#include <boost/math/special_functions/bessel.hpp>int main()
{// 计算圆周率double pi = boost::math::constants::pi<double>();std::cout << "Pi: " << pi << std::endl;// 贝塞尔函数double besselJ0 = boost::math::cyl_bessel_j(0, 2.0);std::cout << "Bessel J0(2.0): " << besselJ0 << std::endl;return 0;
}

编译运行:

g++ -o main main.cpp -lboost_math_c99 -lboost_math_c99f && ./main
Pi: 3.14159
Bessel J0(2.0): 0.223891

Boost.Time使用示例

#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>long GetTime();int main()
{// 获取当前系统时间boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();std::cout << "Current system time: " << now << std::endl;// 格式化输出当前系统时间std::string formattedTime = boost::posix_time::to_simple_string(now);std::cout << "Formatted current system time: " << formattedTime << std::endl;// 日期增减boost::posix_time::ptime tomorrow = now + boost::gregorian::days(1);std::cout << "Tomorrow: " << tomorrow << std::endl;// 时间增减boost::posix_time::ptime nextHour = now + boost::posix_time::hours(1);std::cout << "Next hour: " << nextHour << std::endl;// 时间差计算boost::posix_time::time_duration diff = nextHour - now;std::cout << "Difference between now and next hour: " << diff.total_seconds() << " seconds" << std::endl;// 获取当前系统时间,精确到毫秒boost::posix_time::ptime now_ms = boost::posix_time::microsec_clock::local_time();// 将时间转换为毫秒boost::posix_time::time_duration duration = now_ms.time_of_day();long milliseconds = duration.total_milliseconds();// 输出毫秒级时间std::cout << "Current system milliseconds: " << milliseconds << std::endl;long t1 = GetTime();sleep(1);long t2 = GetTime();// 输出时间差std::cout << "This program cost: " << t2 - t1 << std::endl;return 0;
}long GetTime()
{boost::posix_time::ptime now_ms = boost::posix_time::microsec_clock::local_time();boost::posix_time::time_duration duration = now_ms.time_of_day();long milliseconds = duration.total_milliseconds();return milliseconds;
}

编译运行:

g++ -o main main.cpp -lboost_date_time && ./main
28 16:52:31
Tomorrow: 2023-Jul-29 16:52:31
Next hour: 2023-Jul-28 17:52:31
Difference between now and next hour: 3600 seconds
Current system milliseconds: 60751420
This program cost: 1000

在这里插入图片描述

以上。

相关文章:

【C++】开源:Boost库常用组件配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Boost库常用组件配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c…...

用python通过http实现文件传输,分为发送端和接收端

要使用Python通过HTTP实现文件传输&#xff0c;可以使用Python的 requests 库来发送和接收HTTP请求。以下是一个示例代码&#xff0c;其中包括发送端和接收端的实现。 发送端&#xff1a; import requestsdef send_file(file_path, url):with open(file_path, rb) as file:re…...

数据结构--图的遍历 DFS

数据结构–图的遍历 DFS 树的深度优先遍历 //树的先根遍历 void PreOrder(TreeNode *R) {if(R ! NULL){visit(R); //访问根节点while(R还有下一个子树T)PreOrder(T);//先根遍历下一棵子树} }图的深度优先遍历 bool visited [MAX_VERTEX_NUM]; //访问标记数组 void DFS(Grap…...

SpringBoot集成MyBatisPlus+MySQL(超详细)

前言 查看此文章前强烈建议先看这篇文章&#xff1a;Java江湖路 | 专栏目录 该文章纪录的是SpringBoot快速集成MyBatis Plus&#xff0c;每一步都有记录&#xff0c;争取每一位看该文章的小伙伴都能操作成功。达到自己想要的效果~ 文章目录 前言1、什么是MyBatisPlus2、Spring…...

一边是计算机就业哀鸿遍野,一边是高考生疯狂涌向计算机专业

在张雪峰推荐的几大专业里&#xff0c;计算机专业是其中之一。近几年&#xff0c;计算机专业报考热度不减&#xff0c;但就业前景却令人堪忧&#xff0c;互联网裁员接二连三&#xff0c;许多码农找不到工作。 一位网友感叹&#xff1a;一边是计算机就业哀鸿遍野&#xff0c;一…...

解决外部主机无法访问Docker容器的方法

使用Docker启动了一个tomcat容器&#xff0c;并做了端口映射&#xff0c;但是外部主机仍然无法访问。 编辑centos上的配置文件 vi /etc/sysctl.conf net.ipv4.ip_forward1 systemctl restart network保存以后即可生效&#xff0c;这个配置是开启linux的ip数据包转发功能&#…...

IDEA中修改类头的文档注释信息

IDEA中修改类头的文档注释信息 选择File--Settings--Editor--File and Code Templates--Includes&#xff0c;可以把文档注释写成这种的 /**author: Arbicoralcreate: ${YEAR}-${MONTH}-${DAY} ${TIME}Description: */这样回看就可以很清楚的看到自己创建脚本的时间&#xff…...

建模教程:如何利用3ds Max 和 After Effects 实现多通道渲染和后期合成

推荐&#xff1a; NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 创建基本场景 步骤 1 打开 3ds Max。 打开 3ds Max。 步骤 2 我做了一个简单的场景。我放了三个 彼此之间有一定距离的物体。 制作对象 步骤 3 按 Ctrl-C 键 在透视视图中创建摄影机。 创建相机 …...

JPA之Hibernate

JPA 定义&#xff1a;是 JavaEE 中一组用于持久化数据的 API&#xff0c;它提供了一种标准的 ORM 规范&#xff0c;用于 Java 对象映射到数据库中。 JPA 的开发是为了简化企业级应用程序的开发&#xff0c;降低应用程序与数据库之间的耦合度&#xff0c;并提高应用程序的可维护…...

leetcode(力扣)剑指 Offer 16. 数值的整数次方 (快速幂)

文章目录 题目描述思路分析完整代码 题目描述 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;10…...

git命令分类合集

配置 git config --global user.name <name>&#xff1a;设置全局用户名 git config --global user.email <email>&#xff1a;设置全局用户邮箱 git config --global core.editor <editor>&#xff1a;设置全局文本编辑器创建与克隆仓库 git init&#xf…...

微信小程序打开地图的方法

1、打开内置地图 wx.openLocation({latitude: 31.230416, // 上海的纬度longitude: 121.473701, // 上海的经度name: 上海市, // 地点名称address: 中国上海市黄浦区人民广场, // 地址的详细说明scale: 18, // 缩放比例success: function(res) {console.log(打开地图成功);},f…...

快手头部主播合体,二驴祁天道直播首秀销售额破亿

2023年刚刚过半&#xff0c;直播江湖突然生变。 快手头部娱乐主播「二驴」与快手户外主播第一人「祁天道」宣布“合体”&#xff0c;两者加总的粉丝量接近1亿&#xff0c;又一个“超级网红IP”诞生。 ▲图源&#xff1a;二驴的、祁天道快手截图 从白手起家的草根&#xff0c;…...

Golang Devops项目开发(1)

1.1 GO语言基础 1 初识Go语言 1.1.1 开发环境搭建 参考文档&#xff1a;《Windows Go语言环境搭建》 1.2.1 Go语言特性-垃圾回收 a. 内存自动回收&#xff0c;再也不需要开发人员管理内存 b. 开发人员专注业务实现&#xff0c;降低了心智负担 c. 只需要new分配内存&#xff0c;…...

Django系列之DRF简单使用

基于ModelViewSets的简单使用 models.py from django.db import modelsclass AuthorDetail(models.Model):gender models.CharField(max_length8)birthday models.DateField()telephone models.BigIntegerField()addr models.CharField(max_length64)class Author(models…...

新闻标题文本分类任务

目录 知识回顾使用debug调试 知识回顾 预处理内容 文本主要进行清洗、分词/分字 ID替换(不希望计算机看到文字&#xff0c;而是ID)&#xff0c;通过语料表来表示&#xff0c;根据频率高低来分配ID号 文本的ID映射到文本的一个特征向量&#xff0c;进行词嵌入(Embedding)&…...

自己实现MyBatis 底层机制--抽丝剥茧(上)

&#x1f600;前言 本篇博文是学习过程中的笔记和对于MyBatis底层机制的分析思路&#xff0c;希望能够给您带来帮助&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到…...

Django后端执行成功或失败状态码

后端执行成功或失败以状态码的形式告诉前端&#xff0c;处理成功返回200系列状态码&#xff0c;执行前端then里面的代码&#xff1b;处理失败返回400/500系列状态码&#xff0c;执行catch里面的代码。 200 OK &#xff1a;服务器成功返回用户请求的数据 201 CREATED &#xff…...

Prometheus中的关键设计

1、标准先行&#xff0c;注重生态 Prometheus 最重要的规范就是指标命名方式&#xff0c;数据格式简单易读。比如&#xff0c;对于应用层面的监控&#xff0c;可以要求必须具备这几个信息。 指标名称 metric Prometheus 内置建立的规范就是叫 metric&#xff08;即 __name__…...

Centos7 安装yum

1、检查主机名和网络并且配置/etc/hosts文件 查看主机名&#xff1a;hostname 查看ip :ifconfig vi /etc/hosts//添加把主机名和IP配置进去hosts文件192.18.56.111 orcale12c2、关闭防火墙 systemctl status firewalld.service//检查防火墙状态 暂时关闭防火墙&#xff0c;下…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...