掌握C++17的“武器“:Boost库带来的新特性

C++ 17如何受益于Boost库

  • 一、简介
  • 二、搜索算法
  • 三、文件系统库:filesystem
  • 四、特殊数学函数:clamp、gcd等
  • 五、模板增强:and、or、not
  • 六、C++ 20概览
  • 七、总结

一、简介

在上一篇文章中关于介绍了几个特性:std::optionalstd::variantstd::anystring_view。这篇文章将将讨论更多的元素:std::filesystem搜索器等等!还将对C++ 20简单介绍。

众所周知,Boost库提供了大量标准库中没有的方便算法、类型和特性。许多功能被“移植”到核心C++中。例如,在C++ 11中,获得了std::regex、线程和智能指针。

对于C++ 17,从Boost中采用了以下特性:

  • 词汇类型:std::variantstd::anystd::optional
  • string_view
  • 搜索算法:Boyer MooreBoyer Moore Horspool
  • std::filesystem
  • 特殊数学函数。
  • template 的改进。

在这里插入图片描述

二、搜索算法

Boost提供了三种模式搜索算法:

  • Knuth-Morris-Pratt算法,
  • Boyer-Moore算法,
  • Boyer-Moore- horspool算法。

通过使用预处理步骤,所有的算法都击败了大字符串的普通模式搜索。它们根据输入模式构建额外的表,这样搜索就更有效了。

最后两个算法被移植到C++ 17中,它们可以作为std::search函数的附加搜索对象使用。现在,C++ 17为std::search提供了一个新的重载:

template<class ForwardIterator, class Searcher>
ForwardIterator search( ForwardIterator first, ForwardIterator last,const Searcher& searcher );

Searcher是一个模板参数(所以也可以自己实现),标准库提供了三种类型:

  • default_searcher。
  • boyer_moore_searcher。
  • boyer_moore_horspool_searcher。

使用方式:

std::string testString = "Hello Super World";
std::string needle = "Super";
auto it = search(testString.begin(), testString.end(),boyer_moore_searcher(needle.begin(), needle.end()));
if (it == testString.end())cout << "The string " << needle << " not found\n";

为每个模式创建一次搜索器对象。如果希望在不同的容器中搜索相同的文本,那么可以节省一些预处理时间。

在一些性能实验中,对于更大的模式和boyer_moore,可以获得比默认搜索器更好的性能。例如,当扫描包含547412个字符的文本内部并查找200个字母的模式时,获得了比默认搜索器快8倍的性能加速。甚至比优化后的std::string::find性能提高了3倍。

三、文件系统库:filesystem

这是对C++ 17和标准库的一个巨大的补充。委员会在boost::filesystem方面积累了多年的经验,对其进行了改进,提出了一个技术规范,后来合并到标准中。

典型例子:Boost中的目录迭代。

#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;fs::path inputPath = GetInputPath();
for (const auto& entry : fs::directory_iterator(inputPath))std::cout << entry.path() << '\n';

现在,C++ 17的版本也有了:

#include <filesystem>
namespace fs = std::filesystem;fs::path inputPath = GetInputPath();
for (const auto& entry : fs::directory_iterator(inputPath)) {std::cout << entry.path() << '\n';

觉得有什么不同吗?代码几乎与Boost一样!甚至可以稍微扩展一下,添加更多的日志输出:

#include <filesystem>namespace fs = std::filesystem;for (const auto& entry : fs::directory_iterator(inputPath)) {const auto filenameStr = entry.path().filename().string();if (entry.is_directory()) {std::cout << "dir:  " << filenameStr << '\n';}else if (entry.is_regular_file()) {std::cout << "file: " << filenameStr << '\n';}elsestd::cout << "??    " << filenameStr << '\n';
}

可以看到,在上面的代码中,可以有效地处理路径对象,在目录(无论是否递归)上运行迭代,并打印关于给定目录条目的各种信息。

filesystem 库由四个主要部分组成:

  • 路径对象:表示系统中路径的类型。使用各种方法提取路径部分,组合它,格式之间的转换,甚至从字符串到宽字符串。
  • directory_entry:保存有关某个目录内的路径的信息,以及缓存。
  • 目录迭代器:两个允许扫描目录的类(即只扫描一次或递归扫描一次)。
  • 加上许多支持性的非成员功能:
    • 获取路径信息。
    • 文件操作:复制,移动,创建,符号链接。
    • 最后写时间。
    • 权限。
    • 空间/文件大小
    • ......

这个库是巨大的,它对依赖文件访问的应用程序是非常有益的,毕竟有哪个应用程序不需要与文件一起工作呢?

四、特殊数学函数:clamp、gcd等

Boost库提供了许多算法和函数,甚至可以帮助进行高级数学计算。例如,有一个完整的Math Toolkit 2.9.0 - 1.70.0模块,几乎包含了数学库中的所有功能。C++ 17标准用一些额外的函数扩展了这个库。

clamp, gcdlcm

#include <iostream>
#include <algorithm>  // clamp
#include <numeric>    // for gcm, lcmint main() {std::cout << std::clamp(300, 0, 255) << ', ';   std::cout << std::clamp(-10, 0, 255) << '\n'; std::cout << std::gcd(24, 60) << ', ';std::cout << std::lcm(15, 50) << '\n';    
}

还有一组特殊的数学函数:assoc_laguerre, beta, comp_ellint_1/_2/_3, hermite, laguerre, rieman_zeta等等。

这些特殊数学函数的完整列表可以在官方网址 https://en.cppreference.com/w/cpp/numeric/special_math中找到。

五、模板增强:and、or、not

P0013文献建议将元函数and_or_not_添加到标准库中,并引用Boost.MPL作为长期实现这些特性的标准库之一。该文献在C++ 17中被采纳为std::conjunction std::disjunction std::negation

示例:

template<typename... Ts>
std::enable_if_t<std::conjunction_v<std::is_same<int, Ts>...> >
PrintIntegers(Ts ... args) { (std::cout << ... << args) << '\n';
}

上面的函数PrintIntegers使用可变数量的参数,但它们都必须是int类型。

六、C++ 20概览

在C++ 20中,获得RangesConcepts等,但是你知道Boost中也有一个更早的版本吗?这是一个Boost中的Ranges库链接:Boost Range 2.0 - https://www.boost.org/doc/libs/1_70_0/libs/range/doc/html/index.html。

现在,虽然C++ 20中的Concept是语言的一部分,但可以使用Boost Concept Check Library来模拟它们。该库在很大程度上基于宏,但也可以获得泛型编程的一些概要,以及通过实际Concept实现目标。

七、总结

希望这篇博文能给你更多开始使用C++ 17的动力。最新的C++标准不仅提供了许多语言特性(如if constexpr、结构化绑定、折叠表达式……),而且还提供了来自标准库的一组广泛的实用程序。现在可以使用多种词汇表类型:variantoptionalany。使用字符串视图,甚至一个重要的组件std::filesystem。所有这些都不需要引用一些外部库。

你最喜欢的Boost功能是什么?在评论中分享你的经验吧。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2978572.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Unity3d的海盗王地图

一直以来&#xff0c;都想将海盗王的地图搬到手游unity3d上面。 经过漫长时间的研究&#xff0c;终于实现了当初的想法。

STM32 软件I2C方式读取MT6701磁编码器获取角度例程

STM32 软件I2C方式读取MT6701磁编码器获取角度例程 &#x1f4cd;相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》&#x1f33f;《Arduino通过I2C驱动MT6701磁编码器并读取角度数据》&#x1f530;MT6701芯片和AS5600从软件读取对比&#xff0c;只是读取的寄存器和…

AJAX——Promise-链式调用

1.Promise链式调用 概念&#xff1a;依靠then()方法会返回一个新生成的Promise对象特性&#xff0c;继续串联下一环任务&#xff0c;知道结束 细节&#xff1a;then()回调函数中的返回值&#xff0c;会影响新生成的Promise对象最终状态和结果 好处&#xff1a;通过链式调用&…

恒峰智慧科技—森林消防泵:既可灭除火灾,又可清理水患

在广袤的森林中&#xff0c;火灾与水患如同潜伏的猛兽&#xff0c;时刻威胁着生态的安全。然而&#xff0c;随着科技的进步&#xff0c;我们有了更强大的武器来对抗这些威胁——森林消防泵。这款神奇的设备不仅能迅速扑灭火灾&#xff0c;还能在雨季到来时清理水患&#xff0c;…

ragflow 大模型RAG知识库使用案例

参考: https://github.com/infiniflow/ragflow/blob/main/README_zh.md 支持丰富的文件类型,包括 Word 文档、PPT、excel 表格、txt 文件、图片、PDF、影印件、复印件、结构化数据, 网页等。 运行步骤: 1、确保 vm.max_map_count 不小于 262144 【更多】: 如需确认 vm.…

磐石云外呼系统使用注意事项

磐石云外呼系统是一种基于云计算技术的电话外呼服务&#xff0c;旨在帮助企业提高外呼效率&#xff0c;增强客户沟通和服务能力。在使用过程中&#xff0c;企业需要注意系统的选择、安装、配置、使用方法以及数据安全和合规性等方面的问题。 使用前的准备 在使用磐石云外呼系统…

Apifox 最新功能更新:OAuth 2.0 支持及高级Mock选项

看看本次版本更新主要涵盖的重点内容&#xff0c;有没有你所关注的功能特性&#xff1a; 支持配置 OAuth 2.0 并直接获取访问令牌校验响应设置细化「多分支」支持 Mock自动化测试批量运行可设置统一环境Dubbo 项目调试支持发送 Attachment 隐式参数用户反馈优化 提升加载速度…

电子信息制造工厂5G智能制造数字孪生可视化平台,推进数字化转型

电子信息制造工厂5G智能制造数字孪生可视化平台&#xff0c;推进数字化转型。5G智能制造数字孪生可视化平台利用5G网络的高速、低延迟特性&#xff0c;结合数字孪生技术和可视化界面&#xff0c;为电子信息制造工厂提供了一种全新的生产管理模式。不仅提升生产效率&#xff0c;…

arm架构,django4.2.7适配达梦8数据库

【Python相关包版本信息】 Django 4.2.7 django-dmPython 3.1.7 dmPython 2.5.5 【达梦数据库版本】 DM Database Server 64 V8 DB Version: 0x7000c 适配过程中发现的问题如下&#xff1a; 错误一&#xff1a;d…

抢先看!LEADTOOLS V23 全新版发布,预览全新产品线布局!

LEADTOOLS (Lead Technology)由Moe Daher and Rich Little创建于1990年&#xff0c;其总部设在北卡罗来纳州夏洛特。LEAD的建立是为了使Daher先生在数码图象与压缩技术领域的发明面向市场。在过去超过30年的发展历程中&#xff0c;LEAD以其在全世界主要国家中占有的市场领导地位…

基于高斯壳映射的高效三维人体生成

Gaussian Shell Maps for Efficient 3D Human Generation 基于高斯壳映射的高效三维人体生成 Rameen Abdal*1  Wang Yifan*1  Zifan Shi*†1,2  Yinghao Xu1  Ryan Po1  Zhengfei Kuang1 Rameen Abdal *1 王一凡 *1 Zifan Shi *†1,2 Yinghao Xu 1 Ryan Po 1 Jengfei Kuan…

java对接IPFS系统-以nft.storage为列

引言 之前我们已经说过了、NFT.Storage是一个基于IPFS的分布式存储服务&#xff0c;专门用于存储和管理非同质化代币&#xff08;NFT&#xff09;相关的数据和资产。它是由Protocol Labs和Pinata共同推出的服务。今天我们基于nft.storage为列、使用java对接打通这个ipfs分布式存…

OmniFocus Pro 4.2.1正式激活版 最好用的GTD效率工具

OmniFocus 是一款功能强大的任务管理软件&#xff0c;适合忙碌的专业人士。借助有助于平息混乱的工具&#xff0c;您可以在正确的时间专注于正确的任务。 OmniFocus Pro 4.2.1正式激活版下载 随时随地轻松创建任务&#xff0c;并通过项目、标签和日期进行整理。在任何设备上&am…

埋点,自己写插件,自己写的按钮埋点,掘金同款投递简历

20分钟掌握 Vite 插件开发 - 掘金 vite的生命周期啥的 1.浏览器的控制台输出有样式的字 // const randomLetterPlugin ()>{ // const letters [wwwwwww,000000000000,888888888888]; // //随机获取一个字符并打印 // const printRandomLetter ()>{ // …

【基础算法总结】双指针算法一

双指针 1.移动零2.复写零3.快乐数4.盛水最多的容器 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.移动零 题目链接&#xff1a;283. 移动…

40. UE5 RPG给火球术增加特效和音效

前面&#xff0c;我们将火球的转向和人物的转向问题解决了&#xff0c;火球术可以按照我们的想法朝向目标发射。现在&#xff0c;我们解决接下来的问题&#xff0c;在角色释放火球术时&#xff0c;会产生释放音效&#xff0c;火球也会产生对应的音效&#xff0c;在火球击中目标…

蓝桥杯2024年第十五届省赛真题-拔河

审题可能会遇到的问题&#xff1a;认为所有人都必须参与拔河&#xff0c;但其实不用&#xff0c;只要符合l1<r1<l2<r2就行&#xff0c;不一定要全部人上场&#xff0c;比如只上场a1和a2他们的力量差是1其实也可以。 正解思路&#xff1a;前缀和枚举二分。枚举左区间&…

【Unity学习笔记】第十三 · tag与layer(运行时创建tag和layer)

参考&#xff1a; Unity手册 标签Unity手册 LayersIs it possible to create a tag programmatically?脚本自动添加tag和Layer 注&#xff1a;本文使用Unity版本是2022.3.23f1 转载引用请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/de…

HarmonyOS-静态库(SDK)的创建和使用

文章目录 一、静态库&#xff08;SDK&#xff09;二、创建静态库1.新建静态库模块2. 开发静态库内容3. 编译静态库 三、使用静态库1. 配置项目依赖2. 在应用中使用静态库3. 注意事项 四、打包错误1. library引用本地har包错误 一、静态库&#xff08;SDK&#xff09; 在Harmon…

[XR806开发板试用] ‍ 母婴看板

存在的问题&#xff1a;在家做月子时候&#xff0c;家人希望时不时地进屋里看小孩&#xff0c;但是如果这时候小孩子在睡觉&#xff0c;或者妈妈在哺乳&#xff0c;如果贸然地进来是不是很不礼貌&#xff0c;纵使是敲门&#xff0c;这时候会不会吵到小孩子呢。 解决问题的思路…