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

从Boost到C++17:Boost库带来的新特性

一、简介

这篇文章讨论: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提供了一个新的重载:

代码语言:C++

自动换行

AI代码解释

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

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

  • default_searcher。

  • boyer_moore_searcher。

  • boyer_moore_horspool_searcher。

使用方式:

代码语言:C++

自动换行

AI代码解释

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中的目录迭代。

代码语言:C++

自动换行

AI代码解释

#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的版本也有了:

代码语言:C++

自动换行

AI代码解释

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

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

展开

代码语言:C++

自动换行

AI代码解释

#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'; } else std::cout << "?? " << filenameStr << '\n'; }

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

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

  • 路径对象:表示系统中路径的类型。使用各种方法提取路径部分,组合它,格式之间的转换,甚至从字符串到宽字符串。

  • directory_entry:保存有关某个目录内的路径的信息,以及缓存。

  • 目录迭代器:两个允许扫描目录的类(即只扫描一次或递归扫描一次)。

  • 加上许多支持性的非成员功能:

    • 获取路径信息。

    • 文件操作:复制,移动,创建,符号链接。

    • 最后写时间。

    • 权限。

    • 空间/文件大小

    • ......

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

http://www.jsqmd.com/news/484086/

相关文章:

  • Qwen3.5-35B-A3B-AWQ-4bit效果展示:建筑图纸结构识别、电路图元件标注真实案例
  • 【2026年最新600套毕设项目分享】springboot高校竞赛管理系统(14150)
  • Sendable 协议-Swift 结构化并发的核心安全保障
  • EMQX v3保姆级安装教程:5分钟搞定MQTT服务器搭建(Windows10实测)
  • Z-Image-Turbo镜像详解:内置Supervisor守护,服务稳定不崩溃
  • 【C++笔记】类与对象(初识)
  • 鸿蒙开发进阶之路:从 ArkTS 到分布式应用实践
  • Micropython BLE实战:3步搞定ESP32与手机蓝牙通信(附完整代码)
  • 钓鱼即服务产业化演进与企业防御体系重构研究
  • 用R语言进行土壤侵蚀数据分析
  • 用MATLAB boxplot函数做科研数据分析:箱线图实战案例解析
  • 中兴交换机配置加固方法
  • 【C++】string类--常见接口及其模拟实现
  • 最新!2026年OpenClaw(Clawdbot)云端5分钟集成及使用方法
  • 发光二极管(LED)介绍
  • 解决Notepad++绿色版右键菜单失效的3种方法(注册表+bat+权限问题排查)
  • 探索基于出行链的电动汽车负荷预测模型
  • 2026年热销榜单:十大动环监控系统推荐,让你的机房管理更高效
  • 【MySql】navicat连接报2013错误
  • 低查重不是梦!AI教材写作工具,助力快速且高质量完成教材编写!
  • Go 语言实现 Function Calling 服务端:从协议解析到工具执行
  • 【FFmpeg】H.264 格式分析 ② ( 网络抽象层单元 NALU NALU 功能结构 VCL 视频编码层 NAL 网络提取层 H.264 封装模式 - annexb 模式 )
  • C++ 模板编程的实战应用
  • HCIP-AI-EI Developer V2.5 第二章笔记
  • 剪映专业版教程:制作扇形开合效果
  • JavaScript性能优化实战宗弊
  • 【Flask】四、flask连接并操作数据库
  • crontab 定时任务从入门到上线(语法 + 排障)
  • 基于RRT的路径规划算法在多种移动设备上的实现
  • 探索MATLAB中多个无人船协同围捕控制算法