当前位置: 首页 > 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;下…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...