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

做网站盈利方式阿里云官方网

做网站盈利方式,阿里云官方网,网站制作公司 云南,网站服务器和网站目录 一、文本查询系统的需求分析 二、核心数据结构设计 2.1 行号类型定义 2.2 单词查询结果类 QueryResult 2.3 文本查询类 TextQuery 三、文本查询类的实现 3.1 TextQuery 构造函数 3.2 query 函数 四、重载操作符与类型转换 4.1 重载 << 操作符 4.2 类型转…

目录

一、文本查询系统的需求分析

二、核心数据结构设计

2.1 行号类型定义

2.2 单词查询结果类 QueryResult

2.3 文本查询类 TextQuery

三、文本查询类的实现

3.1 TextQuery 构造函数

3.2 query 函数

四、重载操作符与类型转换

4.1 重载 << 操作符

4.2 类型转换辅助(可选扩展)

五、完整代码示例 

六、功能扩展与优化

七、总结


在软件开发中,文本查询是一个常见的需求,比如搜索引擎、代码编辑器的查找功能等。C++ 提供了丰富的特性来实现高效的文本查询系统,其中重载操作符与类型转换的合理运用,能够让代码更加简洁、直观且易于维护。本文通过一个完整的文本查询示例,详细讲解如何利用 C++ 的重载操作符与转换功能,构建一个功能强大的文本查询工具,并深入剖析其中涉及的核心知识点。

一、文本查询系统的需求分析

一个基础的文本查询系统需要具备以下功能:

  1. 读取文本文件:将文件内容读取到程序中,作为查询的数据源。
  2. 单词索引:记录每个单词在文本中出现的位置(行号)。
  3. 查询功能:用户输入一个单词,系统返回该单词在文本中出现的所有位置及上下文信息。

为了实现这些功能,将借助 C++ 的标准库容器(如 vectormap),并通过重载操作符和类型转换,让代码的使用更加自然流畅。

二、核心数据结构设计

2.1 行号类型定义

首先,定义一个类型 line_no 表示文本中的行号,使用 using 进行类型重命名:

using line_no = std::vector<std::string>::size_type;

这里将 line_no 定义为 std::vector<std::string> 的大小类型,方便后续记录单词在文本中的行号位置。

2.2 单词查询结果类 QueryResult

QueryResult 类用于存储单个单词的查询结果,包括单词本身、包含该单词的文本以及单词出现的行号集合: 

class QueryResult {friend std::ostream& print(std::ostream&, const QueryResult&);std::string sought;  // 要查询的单词std::shared_ptr<std::vector<std::string>> file;  // 指向文本的指针std::shared_ptr<std::set<line_no>> lines;  // 单词出现的行号集合
public:QueryResult(const std::string& s, const std::shared_ptr<std::vector<std::string>>& f,const std::shared_ptr<std::set<line_no>>& l) : sought(s), file(f), lines(l) {}
};

使用智能指针 std::shared_ptr 管理 file 和 lines,确保内存的自动释放和共享。

2.3 文本查询类 TextQuery

TextQuery 类负责读取文本文件,并构建单词索引:

class TextQuery {
public:using line_no = std::vector<std::string>::size_type;TextQuery(std::ifstream&);QueryResult query(const std::string& sought) const;
private:std::shared_ptr<std::vector<std::string>> file;  // 存储文本内容std::map<std::string, std::shared_ptr<std::set<line_no>>> wm;  // 单词到行号集合的映射
};

wm 是一个 map,键为单词,值为指向该行号集合的智能指针,用于快速查找单词出现的位置。

三、文本查询类的实现

3.1 TextQuery 构造函数

构造函数读取文本文件,并构建单词索引: 

TextQuery::TextQuery(std::ifstream& in) : file(std::make_shared<std::vector<std::string>>()) {std::string text;while (std::getline(in, text)) {file->push_back(text);  // 将每行文本存入 fileint n = file->size() - 1;  // 当前行号std::istringstream line(text);  // 将行文本拆分为单词std::string word;while (line >> word) {auto& lines = wm[word];  // 获取单词对应的行号集合if (!lines) {lines.reset(new std::set<line_no>);  // 首次出现,创建新集合}lines->insert(n);  // 记录单词出现的行号}}
}

通过 std::istringstream 将每行文本拆分为单词,并记录每个单词出现的行号。

3.2 query 函数

query 函数根据输入的单词,返回对应的查询结果: 

QueryResult TextQuery::query(const std::string& sought) const {static std::shared_ptr<std::set<line_no>> nodata(new std::set<line_no>);  // 未找到单词时的默认结果auto loc = wm.find(sought);if (loc == wm.end()) {return QueryResult(sought, file, nodata);  // 单词未找到} else {return QueryResult(sought, file, loc->second);  // 返回查询结果}
}

如果单词不存在,返回一个空的行号集合;否则返回该单词对应的行号集合。

四、重载操作符与类型转换

4.1 重载 << 操作符

为了方便输出查询结果,重载 << 操作符: 

std::ostream& print(std::ostream& os, const QueryResult& qr) {os << qr.sought << " occurs " << qr.lines->size() << " "<< (qr.lines->size() > 1? "times" : "time") << std::endl;for (line_no num : *qr.lines) {  // 输出单词出现的每一行os << "\t(line " << num + 1 << ") " << *(qr.file->begin() + num) << std::endl;}return os;
}

该操作符将查询结果以友好的格式输出,包括单词出现的次数和具体行内容。

4.2 类型转换辅助(可选扩展)

在某些场景下,可能需要将 QueryResult 转换为其他类型,比如转换为 JSON 格式用于网络传输。虽然在本示例中未涉及,但可以通过定义类型转换操作符实现: 

// 示例:将 QueryResult 转换为 JSON 字符串(假设存在 JsonString 类型)
operator JsonString() const {// 构建 JSON 字符串逻辑JsonString json;json.add("word", sought);json.add("occurrences", lines->size());// 添加行号和文本内容std::vector<JsonString> lineDetails;for (line_no num : *lines) {JsonString line;line.add("line_number", num + 1);line.add("text", *(file->begin() + num));lineDetails.push_back(line);}json.add("lines", lineDetails);return json;
}

通过定义 operator JsonString(),可以实现 QueryResult 到 JsonString 的隐式转换,方便在不同场景下使用查询结果。

五、完整代码示例 

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <memory>
#include <set>
#include <map>using line_no = std::vector<std::string>::size_type;class QueryResult {friend std::ostream& print(std::ostream&, const QueryResult&);std::string sought;std::shared_ptr<std::vector<std::string>> file;std::shared_ptr<std::set<line_no>> lines;
public:QueryResult(const std::string& s, const std::shared_ptr<std::vector<std::string>>& f,const std::shared_ptr<std::set<line_no>>& l) : sought(s), file(f), lines(l) {}
};class TextQuery {
public:using line_no = std::vector<std::string>::size_type;TextQuery(std::ifstream&);QueryResult query(const std::string& sought) const;
private:std::shared_ptr<std::vector<std::string>> file;std::map<std::string, std::shared_ptr<std::set<line_no>>> wm;
};TextQuery::TextQuery(std::ifstream& in) : file(std::make_shared<std::vector<std::string>>()) {std::string text;while (std::getline(in, text)) {file->push_back(text);int n = file->size() - 1;std::istringstream line(text);std::string word;while (line >> word) {auto& lines = wm[word];if (!lines) {lines.reset(new std::set<line_no>);}lines->insert(n);}}
}QueryResult TextQuery::query(const std::string& sought) const {static std::shared_ptr<std::set<line_no>> nodata(new std::set<line_no>);auto loc = wm.find(sought);if (loc == wm.end()) {return QueryResult(sought, file, nodata);} else {return QueryResult(sought, file, loc->second);}
}std::ostream& print(std::ostream& os, const QueryResult& qr) {os << qr.sought << " occurs " << qr.lines->size() << " "<< (qr.lines->size() > 1? "times" : "time") << std::endl;for (line_no num : *qr.lines) {os << "\t(line " << num + 1 << ") " << *(qr.file->begin() + num) << std::endl;}return os;
}int main() {std::ifstream in("test.txt");  // 假设存在 test.txt 文件if (!in) {std::cerr << "Could not open file" << std::endl;return -1;}TextQuery tq(in);while (true) {std::cout << "enter word to look for, or q to quit: ";std::string s;if (!(std::cin >> s) || s == "q") break;print(std::cout, tq.query(s)) << std::endl;}return 0;
}

 

六、功能扩展与优化

①支持短语查询

通过修改 TextQuery 的索引构建逻辑,不仅记录单个单词的位置,还记录相邻单词组成的短语位置,从而支持短语查询。

②模糊查询

利用字符串匹配算法(如编辑距离算法),实现模糊查询功能,允许用户输入近似的单词进行查询。

③性能优化

  • 数据结构优化:使用更高效的数据结构,如 unordered_map 替换 map,提高单词索引的查询速度。
  • 缓存机制:添加查询结果缓存,避免重复查询相同单词时的重复计算。

七、总结

通过这个文本查询示例,我们深入了解了 C++ 中重载操作符与类型转换的实际应用。重载 << 操作符让查询结果的输出更加直观,而类型转换则为程序的扩展性提供了可能。同时,文本查询系统的实现过程也展示了如何合理运用标准库容器和智能指针,构建高效、安全的程序。在实际开发中,类似的思路可以应用于更多复杂场景,帮助开发者编写出简洁、强大的代码。

希望本文能帮助读者更好地掌握 C++ 的重载操作符与转换特性,并在实际项目中灵活运用。 


 


文章转载自:

http://9YOZwDww.zmrbq.cn
http://LrjHyeU1.zmrbq.cn
http://ahkYNwxO.zmrbq.cn
http://5wfROGee.zmrbq.cn
http://tha9l2ZZ.zmrbq.cn
http://O8w2VocT.zmrbq.cn
http://RVZaI8MC.zmrbq.cn
http://dzURRNFF.zmrbq.cn
http://WEIXuc1Q.zmrbq.cn
http://SaXI2qsE.zmrbq.cn
http://oqg75ZIA.zmrbq.cn
http://z8NIKTyq.zmrbq.cn
http://PplkCUC3.zmrbq.cn
http://e1NCbWoU.zmrbq.cn
http://zZRDNOce.zmrbq.cn
http://sq6OmMo3.zmrbq.cn
http://bB8v2SMQ.zmrbq.cn
http://UYIlvqgn.zmrbq.cn
http://tQWIBuTa.zmrbq.cn
http://Fz1VDAyv.zmrbq.cn
http://7WYPeC1k.zmrbq.cn
http://B21rYZrs.zmrbq.cn
http://5r6tIIpD.zmrbq.cn
http://xxdXYCuh.zmrbq.cn
http://g2KIqyE2.zmrbq.cn
http://qw25Wx03.zmrbq.cn
http://a9yBhvK9.zmrbq.cn
http://zDMmS54t.zmrbq.cn
http://K6qKgyM5.zmrbq.cn
http://BunRjBee.zmrbq.cn
http://www.dtcms.com/wzjs/662973.html

相关文章:

  • 南宁seo站内关键词优化西安今天的新消息未央区
  • 最新备案网站查询珠海市网站建设制作设计平台
  • 南同网站建设商场网站建设模板
  • 自己搭建视频播放网站公司网站设计与管理
  • 数据库跟网站内容时间轴 wordpress
  • 网站架构设计师薪资水平廊坊企业免费建站
  • 建设网站平台哪里最好做设计网站的工作
  • 北京手机网站制作公司江阴网站开发
  • 营销方案英文衡水网站seo
  • 山东建设厅科技处网站新东方小吃培训价格表
  • 什么软件可以发布做网站外贸找客户平台
  • 怎样做网站备份app大全软件下载
  • 购物网站下载昆山做网站需要多少钱
  • 网站建设网站美工工作计划wordpress赚钱插件
  • 组建一个网站高邮建设网站
  • 泰州建站免费模板简述对网站进行评析的几个方面.
  • 织梦网站更改网站的导航推广途径有哪些
  • 旅游网站设计说明书网站建设流程周期
  • 济南网站优化收费代理公司注册流程
  • 山西手机版建站系统开发大型企业名录查询
  • 创新的企业网站开发hdmi高清wifi无线传输器
  • 品牌网站建设解决方怎么在百度上做推广
  • 男孩子怎么做网站赚钱上海已经开始二次感染了
  • 网站开发洲际品牌创建的六个步骤
  • 营销网站建设内容织梦仿站建站网站建设实战
  • 网站建设需要多久才能学会济南网站托管运营
  • 给网站网站做设计无锡建设机械网站
  • 国外网站 备案吗石家庄小程序开发多少钱
  • 如何再网站上做免费广告策划书封面
  • html企业网站模板wordpress里面的附件如何导出