【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库常用组件配置使用
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Boost库常用组件配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,…...
用python通过http实现文件传输,分为发送端和接收端
要使用Python通过HTTP实现文件传输,可以使用Python的 requests 库来发送和接收HTTP请求。以下是一个示例代码,其中包括发送端和接收端的实现。 发送端: 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(超详细)
前言 查看此文章前强烈建议先看这篇文章:Java江湖路 | 专栏目录 该文章纪录的是SpringBoot快速集成MyBatis Plus,每一步都有记录,争取每一位看该文章的小伙伴都能操作成功。达到自己想要的效果~ 文章目录 前言1、什么是MyBatisPlus2、Spring…...
一边是计算机就业哀鸿遍野,一边是高考生疯狂涌向计算机专业
在张雪峰推荐的几大专业里,计算机专业是其中之一。近几年,计算机专业报考热度不减,但就业前景却令人堪忧,互联网裁员接二连三,许多码农找不到工作。 一位网友感叹:一边是计算机就业哀鸿遍野,一…...
解决外部主机无法访问Docker容器的方法
使用Docker启动了一个tomcat容器,并做了端口映射,但是外部主机仍然无法访问。 编辑centos上的配置文件 vi /etc/sysctl.conf net.ipv4.ip_forward1 systemctl restart network保存以后即可生效,这个配置是开启linux的ip数据包转发功能&#…...
IDEA中修改类头的文档注释信息
IDEA中修改类头的文档注释信息 选择File--Settings--Editor--File and Code Templates--Includes,可以把文档注释写成这种的 /**author: Arbicoralcreate: ${YEAR}-${MONTH}-${DAY} ${TIME}Description: */这样回看就可以很清楚的看到自己创建脚本的时间ÿ…...
建模教程:如何利用3ds Max 和 After Effects 实现多通道渲染和后期合成
推荐: NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 创建基本场景 步骤 1 打开 3ds Max。 打开 3ds Max。 步骤 2 我做了一个简单的场景。我放了三个 彼此之间有一定距离的物体。 制作对象 步骤 3 按 Ctrl-C 键 在透视视图中创建摄影机。 创建相机 …...
JPA之Hibernate
JPA 定义:是 JavaEE 中一组用于持久化数据的 API,它提供了一种标准的 ORM 规范,用于 Java 对象映射到数据库中。 JPA 的开发是为了简化企业级应用程序的开发,降低应用程序与数据库之间的耦合度,并提高应用程序的可维护…...
leetcode(力扣)剑指 Offer 16. 数值的整数次方 (快速幂)
文章目录 题目描述思路分析完整代码 题目描述 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。 示例 1: 输入:x 2.00000, n 10 输出:10…...
git命令分类合集
配置 git config --global user.name <name>:设置全局用户名 git config --global user.email <email>:设置全局用户邮箱 git config --global core.editor <editor>:设置全局文本编辑器创建与克隆仓库 git init…...
微信小程序打开地图的方法
1、打开内置地图 wx.openLocation({latitude: 31.230416, // 上海的纬度longitude: 121.473701, // 上海的经度name: 上海市, // 地点名称address: 中国上海市黄浦区人民广场, // 地址的详细说明scale: 18, // 缩放比例success: function(res) {console.log(打开地图成功);},f…...
快手头部主播合体,二驴祁天道直播首秀销售额破亿
2023年刚刚过半,直播江湖突然生变。 快手头部娱乐主播「二驴」与快手户外主播第一人「祁天道」宣布“合体”,两者加总的粉丝量接近1亿,又一个“超级网红IP”诞生。 ▲图源:二驴的、祁天道快手截图 从白手起家的草根,…...
Golang Devops项目开发(1)
1.1 GO语言基础 1 初识Go语言 1.1.1 开发环境搭建 参考文档:《Windows Go语言环境搭建》 1.2.1 Go语言特性-垃圾回收 a. 内存自动回收,再也不需要开发人员管理内存 b. 开发人员专注业务实现,降低了心智负担 c. 只需要new分配内存,…...
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替换(不希望计算机看到文字,而是ID),通过语料表来表示,根据频率高低来分配ID号 文本的ID映射到文本的一个特征向量,进行词嵌入(Embedding)&…...
自己实现MyBatis 底层机制--抽丝剥茧(上)
😀前言 本篇博文是学习过程中的笔记和对于MyBatis底层机制的分析思路,希望能够给您带来帮助😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到…...
Django后端执行成功或失败状态码
后端执行成功或失败以状态码的形式告诉前端,处理成功返回200系列状态码,执行前端then里面的代码;处理失败返回400/500系列状态码,执行catch里面的代码。 200 OK :服务器成功返回用户请求的数据 201 CREATED ÿ…...
Prometheus中的关键设计
1、标准先行,注重生态 Prometheus 最重要的规范就是指标命名方式,数据格式简单易读。比如,对于应用层面的监控,可以要求必须具备这几个信息。 指标名称 metric Prometheus 内置建立的规范就是叫 metric(即 __name__…...
Centos7 安装yum
1、检查主机名和网络并且配置/etc/hosts文件 查看主机名:hostname 查看ip :ifconfig vi /etc/hosts//添加把主机名和IP配置进去hosts文件192.18.56.111 orcale12c2、关闭防火墙 systemctl status firewalld.service//检查防火墙状态 暂时关闭防火墙,下…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
