C++之基于正倒排索引的Boost搜索引擎项目usuallytool部分代码及详解

C++之基于正倒排索引的Boost搜索引擎项目usuallytool部分代码及详解
这部分是通用工具部分的代码,简单来说就是这份代码里面的函数会在项目的其他多个部分里面被使用,所以我们专门创建一个部分用来存储这些代码。

1.FileUtil

这个类就是专门用来读取文件用的,这个代码从指定的文件路径读取文件内容,将读取到的内容(按行读取)追加到传入的字符串指针(out)所指向的字符串中;同时,该方法会返回一个布尔值,用于标识读取操作是否成功 —— 若文件成功打开并完成读取,返回 true;若文件打开失败(如路径错误等),则输出错误信息并返回 false。

文件以二进制输入模式打开,读取过程中不会修改原文件内容。

class FileUtil{ public: static bool ReadFile(const std::string &file_path,std::string *out) { //下面这行代码就是在打开文件,并通过ifstream定义一个对象in,用于关联特定的文件 std::ifstream in(file_path,std::ios::in | std::ios::binary); //这两边的in不是同一个东西,前面那个in用于关联特定的文件 //后面那个in是指定文件的打开方式,表示 "以输入模式打开文件"(即只读模式) if(!in.is_open())//这边判断文件是否打开,没打开就退出 { std::cout<<"open file "<<file_path<<": error"<<std::endl; return false; } //while里面要求是bool类型,然后getline的返回类型是输入流引用 //但在实际使用中能当作 bool 类型来使用,因为重载了 bool 类型转换操作符。 //简单来说就是要bool的地方C++会尝试转换成bool类型 std::string line; while(std::getline(in,line)) *out+=line;//把file_path的内容添加到out里面 //in 的只读特性限制的是 “不能写原文件”,而*out+=line并没有试图修改原文件 in.close();//关闭文件 return true; } };

2.JiebaUsutl

这边的话我们是相当于套皮,就是jieba这个非标准库里面有用来分词的函数,然后我们相当于是把那个函数的路径给拿出来,然后通过调用这几个路径里面的构造函数来初始化一个jieba的类,然后我们通过CutString来调用实例化后的jieba类里面的CutForSearcher来实现分词。

为什么我们要加static 呢?

1. 对于静态成员变量jieba

cppjieba::Jieba对象的初始化依赖词典文件,初始化成本较高,且分词功能通常只需要一个实例即可满足需求。用static修饰后,jieba成为类级别的成员,整个程序运行期间只会被初始化一次,避免了重复创建对象带来的资源消耗和冗余操作。确保所有使用JiebaUsutl类进行分词的地方,都共享同一个jieba实例,保证分词逻辑和词典数据的一致性。

2. 对于静态成员函数CutString

该函数的功能是调用jieba的分词方法,而jieba是静态成员(属于类本身),不需要依赖JiebaUsutl的具体实例即可访问。因此,CutStringstatic修饰后,可以直接通过类名(如JiebaUsutl::CutString)调用,无需先创建JiebaUsutl对象,简化了使用方式。

const char* const DICT_PATH = "test/cppjieba/dict/jieba.dict.utf8"; const char* const HMM_PATH = "test/cppjieba/dict/hmm_model.utf8"; const char* const USER_DICT_PATH = "test/cppjieba/dict/user.dict.utf8"; const char* const IDF_PATH = "test/cppjieba/dict/idf.utf8"; const char* const STOP_WORD_PATH = "test/cppjieba/dict/stop_words.utf8"; //test/cppjieba/test这个路径就是那个分词的函数所在的位置 class JiebaUsutl{//这边就是通过cpppjieba里面的分词来进行分词 private: static cppjieba::Jieba jieba; public: static void CutString(const std::string& src,std::vector<std::string>* out) { jieba.CutForSearch(src,*out);//这个CutForSearch就是cppjieba里面的函数 } }; cppjieba::Jieba JiebaUsutl::jieba(DICT_PATH,HMM_PATH,USER_DICT_PATH,IDF_PATH,STOP_WORD_PATH); //对类 JiebaUsutl 中的静态成员 jieba 进行初始化。 //传入几个词典相关的路径(DICT_PATH、HMM_PATH 等),就是调用 Jieba 的构造函数,用这些路径来初始化 JiebaUsutl 类里的静态成员 jieba。 //这样,在后续使用 JiebaUsutl::CutString 方法时,jieba 这个静态对象已经被正确初始化,可以调用其 CutForSearch 方法来进行分词操作了。

3. 总结

以下就是usuallytool部分的完整代码,基本上来说我们只要写项目那就肯定是需要一份usuallytool的。

#pragma once #include<iostream> #include<string> #include<fstream> #include<boost/algorithm/string.hpp> #include"cppjieba/Jieba.hpp" namespace ns_util{ class FileUtil{ public: static bool ReadFile(const std::string &file_path,std::string *out) { //下面这行代码就是在打开文件,并通过ifstream定义一个对象in,用于关联特定的文件 std::ifstream in(file_path,std::ios::in | std::ios::binary); //这两边的in不是同一个东西,前面那个in用于关联特定的文件 //后面那个in是指定文件的打开方式,表示 "以输入模式打开文件"(即只读模式) if(!in.is_open())//这边判断文件是否打开,没打开就退出 { std::cout<<"open file "<<file_path<<": error"<<std::endl; return false; } //while里面要求是bool类型,然后getline的返回类型是输入流引用 //但在实际使用中能当作 bool 类型来使用,因为重载了 bool 类型转换操作符。 //简单来说就是要bool的地方C++会尝试转换成bool类型 std::string line; while(std::getline(in,line)) *out+=line;//把file_path的内容添加到out里面 //in 的只读特性限制的是 “不能写原文件”,而*out+=line并没有试图修改原文件 in.close();//关闭文件 return true; } }; class StringUtil{ public: //target是要切分的目标,out是最后把结果输入到里面,sep是分隔符(\3) static void Split(const std::string& target,std::vector<std::string>* out,std::string sep) { boost::split(*out,target,boost::is_any_of(sep),boost::token_compress_on); //split这个函数就是用来对字符串做切分的 //token_compress_on表示会把连续的“\3”合并成一个 } }; const char* const DICT_PATH = "test/cppjieba/dict/jieba.dict.utf8"; const char* const HMM_PATH = "test/cppjieba/dict/hmm_model.utf8"; const char* const USER_DICT_PATH = "test/cppjieba/dict/user.dict.utf8"; const char* const IDF_PATH = "test/cppjieba/dict/idf.utf8"; const char* const STOP_WORD_PATH = "test/cppjieba/dict/stop_words.utf8"; //test/cppjieba/test这个路径就是那个分词的函数所在的位置 class JiebaUsutl{//这边就是通过cpppjieba里面的分词来进行分词 private: static cppjieba::Jieba jieba; public: static void CutString(const std::string& src,std::vector<std::string>* out) { jieba.CutForSearch(src,*out);//这个CutForSearch就是cppjieba里面的函数 } }; cppjieba::Jieba JiebaUsutl::jieba(DICT_PATH,HMM_PATH,USER_DICT_PATH,IDF_PATH,STOP_WORD_PATH); //对类 JiebaUsutl 中的静态成员 jieba 进行初始化。 //传入几个词典相关的路径(DICT_PATH、HMM_PATH 等),就是调用 Jieba 的构造函数,用这些路径来初始化 JiebaUsutl 类里的静态成员 jieba。 //这样,在后续使用 JiebaUsutl::CutString 方法时,jieba 这个静态对象已经被正确初始化,可以调用其 CutForSearch 方法来进行分词操作了。 }; 

Read more

Git多环境开发困局终结者,VSCode智能工作树支持全解析

第一章:VSCode 后台智能体 Git 工作树支持 Visual Studio Code(VSCode)在现代开发流程中扮演着核心角色,其内置的 Git 支持与后台智能代理机制显著提升了版本控制的操作效率。通过集成 Git 工作树(worktree)功能,开发者可以在同一仓库下管理多个独立的工作分支目录,而无需切换分支或复制项目。 启用多工作树支持 VSCode 的后台智能体能够自动识别 Git 工作树结构,当使用 git worktree add 命令创建新工作树时,VSCode 会将其作为独立项目路径处理,并保留各自的编辑状态和调试配置。 例如,执行以下命令可创建一个用于修复紧急问题的临时工作树: # 创建名为 hotfix-branch 的新工作树 git worktree add ../hotfix-branch hotfix # 输出提示:准备在新目录中打开项目 该操作完成后,可直接在 VSCode 中打开 ../hotfix-branch

By Ne0inhk
Linux 系统下 Git 的详细安装步骤和基础设置指南

Linux 系统下 Git 的详细安装步骤和基础设置指南

Linux 系统下 Git 的详细安装步骤和基础设置指南—目录 * 一、安装 Git * 1. Debian/Ubuntu 系统 * 2. CentOS/RHEL 系统 * 3. Fedora 系统 * 4. Arch/Manjaro 系统 * 5. 其他方式:源码编译安装(适用于所有发行版) * 二、基础配置 * 1. 设置全局用户名和邮箱 * 2. 配置 SSH 密钥(用于 GitHub/GitLab 等) * 3. 配置 Git 别名(简化命令) * 4. 启用自动换行符转换(解决跨平台换行符问题) * 三、高级设置 * 1.

By Ne0inhk

完全免费!用阿里开源 CoPaw 养一只属于自己的 AI 小助理(魔搭启动,亲测有效)

先说一个小插曲:前几天我写了一篇介绍 Maxclaw 的文章,当时还是免费的,结果文章发出去没多久,Minimax 就悄悄改了规则,变成 39 元一个月起步了。当然,39 元其实也不贵——毕竟你去闲鱼搜"openclaw 代安装",随便一个人工服务都要 50 块往上走。但既然有完全免费的方案,为什么不用呢? 今天这篇,就给大家介绍一个我亲自跑通的、完全免费的方案:用阿里开源的 CoPaw,在魔搭创空间里一键启动,服务器免费,Token 每天 2000 次免费调用,不用装任何本地环境,浏览器打开就能用。 CoPaw 是什么?先用一分钟搞清楚 很多人第一次听到 CoPaw 这个名字,会以为是某种宠物应用。其实它的全称是 Co Personal Agent Workstation,是阿里

By Ne0inhk
【DREAMVFIA开源】量子云平台构建:服务化量子计算资源管理

【DREAMVFIA开源】量子云平台构建:服务化量子计算资源管理

版权声明:本文为DREAMVFIA开源项目系列文章,版权所有 © 2026 DREAMVFIA UNION。未经授权,任何单位或个人不得以任何形式转载、复制或用于商业目的。** 摘要 随着量子计算技术的快速发展,量子云计算作为一种新兴的计算范式正在改变传统计算资源的提供方式。量子云平台通过将量子计算资源以服务的形式提供给用户,实现了量子计算资源的高效利用和共享。本文深入研究了量子云平台的核心技术,重点探讨了服务化量子计算资源管理的设计与实现。文章首先分析了量子云计算的发展背景和意义,介绍了IBM Quantum Experience、Amazon Braket、Google Quantum AI等主流量子云平台的架构特点。在此基础上,本文提出了一种基于微服务架构的量子云平台方案,详细阐述了资源抽象层、服务编排层和应用接口层的设计理念与实现方法。在资源管理方面,本文提出了量子任务调度算法、资源分配策略和负载均衡机制,并通过Python和Go语言实现了核心模块。性能评估表明,所提出的方案能够有效提高量子计算资源的利用率,降低任务等待时间,满足多用户并发访问的需求。本文的研究成果为构建

By Ne0inhk