5.编写写入文件代码|调试|编写建立索引的模块index的代码结构(C++)

postgreSQL源码分析——索引的建立与使用——各种索引类型的管理和操作(1) 2021SC@SDUSC 目录 阅读详情
编写写入文件代码

将解析内容写⼊⽂件中

采⽤下⾯的⽅案:  
version2: 写⼊⽂件中,⼀定要考虑下⼀次在读取的时候,也要⽅便操作 
类似:title\3content\3url \n title\3content\3url \n title\3content\3url \n ...  
⽅便我们getline(ifsream, line),直接获取⽂档的全部内容:title\3content\3url
bool ParseHtml(const std::vector<std::string> &files_list, std::vector<DocInfo_t> *results)
{
	for(const std::string &file : files_list){
		//读取文件,Read();
		std::string result;
		if(!ns_util::FileUtil::ReadFile(file, &result)){
			continue;
		}
		DocInfo_t doc;
		//解析指定的文件,提取title
		if(!ParseTitle(result, &doc.title)){
			continue;
		}
		//解析指定的文件,提取content,就是去标签
		if(!ParseContent(result, &doc.content)){
			continue;
		}
		//解析指定的文件路径,构建url
		if(!ParseUrl(file, &doc.url)){
			continue;
		}

		//done,一定是完成了解析任务,当前文档的所有的相关结果都保存在了doc里面
		results->push_back(std::move(doc)); //bug:todo;细节,本质会发生拷贝,效率可能会比较低

		//for debug
		//ShowDoc(doc);
		//break;
	}
	return true;
}


bool SaveHtml(const std::vector<DocInfo_t> &results, const std::string &output)
{
#define SEP '\3'
	//按照二进制方式进行写入
	std::ofstream out(output, std::ios::out | std::ios::binary);
	if(!out.is_open()){
		std::cerr << "open " << output << " failed" << std::endl;
		return false;
	}

	//进行文件内容的写入
	for(auto &item : results){
		std::string out_string;
		out_string = item.title;
		out_string += SEP;
		out_string += item.content;
		out_string += SEP;
		out_string += item.url;
		out_string += '\n';

		out.write(out_string.c_str(), out_string.size());
	}

	out.close();

	return true;
}
调试

![[Pasted image 20250215182528.png]]

打开raw.txt文件
![[Pasted image 20250215182840.png]]

^C就是\3
Site Unreachable
第一个网页
![[Pasted image 20250215183309.png]]

当前项目内容
![[Pasted image 20250215183558.png]]

编写建立索引的模块index

代码结构

建立index.hpp文件
![[Pasted image 20250215183748.png]]

#pragma once

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>

namespace ns_index{

	struct DocInfo{
		std::string title;   //文档标题
		std::string content; //文档对应的去标签之后的内容
		std::string url;     //官网文档url
		uint64_t dic_id;     //文档的ID
	}

	struct InvertedElem{
		uint64_t doc_id;
		std::string word;
		int weight;
	}

	//倒排拉链
	typedef std::vector<InvertedElem> InvertedList;

	class Index{
		private:
			//正排索引的数据结构用数组,数组的下标天然是文档的ID
			std::vector<DocInfo> forward_index; //正排索引
			//倒排索引一定是一个关键字和一组(个)InvertedElem对应[关键字和倒排拉链的映射关系]
			std::unordered_map<std::string, InvertedList> inverted_index;
		public:
			Index(){}
			~Index(){}
		public:
			//根据doc_id找到文档内容
			DocInfo *GetForwardIdex(uint64_t doc_id)
			{
				return nullptr;
			}
			//根据关键字string获得倒排拉链
			InvertedList *GetInvertedList(const std::string &word)
			{
				return nullptr;
			}
			//根据去标签,格式化之后的文档,构建正排和倒排索引
			//data/raw_html/raw.txt
			bool BuildIndex(const std::string &input) //parse处理完毕的数据交给我
			{
				return true;
			}
	};
}
编写代码索引准备工作
#pragma once

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <unordered_map>

namespace ns_index{
	struct DocInfo{
		std::string title;   //文档标题
		std::string content; //文档对应的去标签之后的内容
		std::string url;     //官网文档url
		uint64_t dic_id;     //文档的ID
	}

	struct InvertedElem{
		uint64_t doc_id;
		std::string word;
		int weight;
	}

	//倒排拉链
	typedef std::vector<InvertedElem> InvertedList;

	class Index{
		private:
			//正排索引的数据结构用数组,数组的下标天然是文档的ID
			std::vector<DocInfo> forward_index; //正排索引
			//倒排索引一定是一个关键字和一组(个)InvertedElem对应[关键字和倒排拉链的映射关系]
			std::unordered_map<std::string, InvertedList> inverted_index;
		public:
			Index(){}
			~Index(){}

		public:
			//根据doc_id找到文档内容
			DocInfo *GetForwardIdex(uint64_t doc_id)
			{
				if(doc_id >= forward_index.size()){
					std::cerr << "doc_id out range, error" << std::endl;
					return nullptr;
				}
				return &forward_index[doc_id];
			}

			//根据关键字string获得倒排拉链
			InvertedList *GetInvertedList(const std::string &word)
			{
				auto iter = inverted_index.find(word);
				if(iter == inverted_index.end()){
					std::cerr << word << " have no InvertedList" << std::endl;
					return nullptr;
				}

				return &(iter->second);
			}
			//根据去标签,格式化之后的文档,构建正排和倒排索引
			//data/raw_html/raw.txt
			bool BuildIndex(const std::string &input) //parse处理完毕的数据交给我
			{
				std::ifstream in(input, std::ios::in | std::ios::binary);
				if(!in.is_open()){
					std::cerr << "sorry, " << input << " open error" << std::endl;
					return false;
				}

				std::string line;
				while(std::getline(in, line)){
					DocInfo * doc = BuildForwardIndex(line);
					if(nullptr == doc){
						std::cerr << "build " << line << " error" << std::endl; //for debug
						continue;
					}

					BuildInvertedIndex(*doc);
				}
				return true;
			}
		private:
			DocInfo *BuildForwardIndex(const std::string &line)
			{

			}

			bool BuildInvertedIndex(const DocInfo &doc)
			{

			}
	};
}
Pandas索引操作:set_index与reset_index核心用法与实战技巧 在数据处理与分析中,索引是高效组织和访问数据的核心机制。其原理在于为数据行提供唯一或分层的标识,从而替代顺序扫描,实现基于哈希或树结构的快速查找。这一机制的技术价值在于显著提升数据查询、对齐和聚合操作的性能,尤其在处理大规模数据集时效果明显。常见的应用场景包括时间序列分析、多维度数据切片、表连接以及分组聚合后的结果整理。本文聚焦于Pandas中的set_index与reset_index这两个关键方法,通过解析多层索引创建、时间序列处理以及索引与列的角色转换等热词场景,帮助读者掌握如何灵活运用索引来优化数据 阅读详情

相关推荐

Simulink Selector模块详解:数据选择、动态索引与代码生成优化

在控制系统建模与仿真中,信号路由与数据选择是构建清晰、高效模型的基础。其核心原理在于通过索引机制,从多维信号(如向量、矩阵)中精确提取目标元素或子集,实现数据的定向流动与处理。这项技术的核心价值在于提升模型的模块化程度、可读性以及仿真效率,并为后续的嵌入式代码生成铺平道路。在工程实践中,它广泛应用于多路传感器信号切换、矩阵运算子块提取、以及结合状态机实现动态算法选择等场景。本文聚焦于Simulink中的Selector模块,深入解析其索引模式(包括One-based与Zero-based)、动态端口索引配置

weixin_30647423的博客 317

C++中的index索引号

index, 索引号, 一般从0开始计数。返回的是字符数组下标中从0开始计数,每一位中的内容。 const char *map[4] = {        "A maple is a carnivore",        "A maple is a pianist",        "A maple is a tree",        "A maple is a game" }; ...

qq_41805081的博客 1万+

从Simulink模型到C代码:Assignment模块的‘Index Mode’选Zero还是One?一个影响深远的决定

本文深入探讨了Simulink模型中Assignment模块的'Index Mode'选择对C代码生成的影响,分析了Zero-based与One-based索引模式的技术差异、团队协作挑战及AUTOSAR标准建议。通过实际案例和决策框架,帮助工程师在嵌入式开发中做出更优选择,提升代码兼容性和开发效率。

weixin_28744613的博客 374

8.编写测试server|编写获取摘要代码(C++)

private://供系统进行查找的索引public:public://1. 获取或者创建index对象std::cout << "获取index单例成功..." << std::endl;//2. 根据index对象建立索引std::cout << "建立正排和倒排索引成功..." << std::endl;//query: 搜索关键字//json_string: 返回给用户浏览器的搜索结果//1.[分词]:对我们的query进行按照searcher的要求进行分词。

ChoSeitaku的博客 297

操作系统文件索引实战:混合索引结构下逻辑块号到物理块号的映射解析

本文深入解析操作系统文件系统中混合索引结构下逻辑块号到物理块号的映射机制,详细介绍了直接索引、一级间接索引和二级间接索引的工作原理及映射算法。通过具体案例和性能优化建议,帮助开发者理解文件系统核心设计,提升系统级编程能力,特别适合准备软考或深入研究操作系统的技术人员。

CURSED! 464

C语言图书管理系统实战:从结构体设计到文件持久化

在软件工程实践中,数据结构与文件操作是构建可维护、数据持久化应用的两大基石。数据结构,特别是结构体(struct),为复杂数据的逻辑组织提供了清晰蓝图,是C语言中实现自定义数据类型的核心机制。文件操作则是程序与外部世界交互、实现数据持久化的关键技术,它确保了程序状态在多次运行间的连续性。这两项技术的结合,其技术价值在于能够将内存中的动态数据模型,通过序列化过程,稳定地存储于物理介质,从而支撑起从简单的学生管理系统到复杂的业务应用等广泛场景。本文以图书管理系统为例,深入探讨了如何利用结构体定义图书信息模型,并

weixin_33726313的博客 417

MySQL 表 t1 建立联合索引 (a, b, c),在 where a < ? and b > ? and c < ? 中哪些索引生效

这里只分析了目前能想到的常见情况,其实还有很多,这是由于查询优化器会对查询进行优化,包括重写查询、决定表的读写顺序、选择合适的索引等,综合考虑数据量、是否回表、回表成本、索引区分度等因素生成查询成本最小的执行计划。无回表 + 表数据量非常少:使用覆盖索引进行全索引扫描,索引字段 a、b、c 都未生效(未使用索引进行条件过滤)。

是谢添啊 1315

线性代数知识点整理

线性代数基础知识点摘要整理

cuguanren的博客 3万+

faiss_tips:FAISS索引3种序列化方法全解析,read_index与pickle保存加载完整教程

在向量检索项目中,训练好的 FAISS 索引如果只存在内存里,程序重启后就会全部丢失。开源项目 faiss_tips 专门整理了这类实用技巧,本文带你一次性掌握 3 种 FAISS 索引序列化方法:`write_index`/`read_index` 文件读写、`serialize_index`/`deserialize_index` 二进制数组序列化,以及 pickle 保存加载,轻松解决索引持

gitblog_00204的博客 1076

将AAL图谱对应到Yeo7大网络中【原理,代码分析】

本文介绍了将AAL2图谱映射到Yeo7大功能网络的方法。通过整合皮层(Yeo2011)、小脑(Buckner2011)和纹状体(Choi2012)三个区域的功能网络图谱,采用投票机制确定每个AAL区域的网络归属。具体步骤包括:1)统计每个AAL区域体素在各网络图谱中的分布;2)选择体素数量最多的网络作为该区域的最终标签。该方法实现了从解剖结构到功能网络的映射,可获得120个AAL区域对应的7大功能网络标签。

yes666666的博客 2204

Android14_MTK调试LCD屏功能

android14 MTK平台调试LCD屏

m0_37786046的博客 1471

53.llama_index-向量存储、索引存储

本文介绍了LlamaIndex框架中的向量存储(VectorStore)和索引存储(IndexStore)的实现方式。主要内容包括:1. 使用SimpleVectorStore和Chroma两种向量存储方案,分别实现本地内存存储和持久化向量数据库存储;2. 索引存储(IndexStore)的作用是管理向量数据的存储结构;3. 详细展示了如何从文档加载、切分、生成向量到存储的完整流程;4. 提供了Redis作为生产环境存储的解决方案;5. 解释了索引持久化和加载复用的方法。文中还包含代码示例,展示了如何通过L

计算机王的博客 1079

YOLO与3D点云融合:从原理到实践的多模态3D目标检测指南

最近在实验室和几个研究生聊天,发现一个挺有意思的现象:大家一提到“YOLO+3D点云”这个组合,第一反应往往是“顶会热门”、“发论文利器”,但真上手去复现或者想基于这个方向做点创新时,又常常卡在第一步——感觉每个部分都懂一点,但就是串不起来,不知道从哪开始,也不知道核心的“价值点”到底在哪。 这让我想起几年前刚开始接触这个领域时的自己,也经历过同样的困惑。当时看了很多论文,感觉“3D目标检测”这个方向既酷又难,YOLO负责2D图像里的快速定位,点云提供精确的三维空间信息,听起来是天作之合。但真正把代码跑起来

weixin_34267123的博客 413

【C语言】解决C语言报错:Array Index Out of Bounds

Array Index Out of Bounds(数组索引越界)是C语言中常见且危险的错误之一。它通常在程序试图访问数组中不合法的索引位置时发生。这种错误会导致程序行为不可预测,可能引发段错误(Segmentation Fault)、数据损坏,甚至安全漏洞。本文将详细介绍Array Index Out of Bounds的产生原因,提供多种解决方案,并通过实例代码演示如何有效避免和解决此类错误。Array Index Out of Bounds,即数组索引越界,是指程序试图访问数组中超出其边界的元素。

Easonmax的博客 5826

CRaxsRat v7.6 安装与使用教程(附工具下载)

摘要:本文介绍远程管理工具CRaxsRat v7.6的合法应用与基本操作,强调仅限授权环境使用。该工具支持多客户端管理、TLS加密及文件/进程控制等功能,适用于内网维护与安全测试。安装需Windows 10/11系统及.NET 4.8,步骤包括解压运行、配置监听端口及生成客户端。文中提醒防火墙设置与杀软误报问题,并重申禁止非法用途,建议在虚拟机或隔离环境学习使用。

lzj781210的博客 3787

AI奶牛TMR智能饲喂机器人 Qt信创完整项目( 统信/麒麟国产系统直接编译)

内置**犊牛、育成牛、围产牛、泌乳牛、干奶牛**5套标准化饲喂配方;+" 饲喂批次完成|牛群:"+grpText+"|投喂饲料:"+QString::number(ft)+"吨|剩料:"+QString::number(st)+"吨|异常牛:"+QString::number(abCow);cv::putText(frame,"霉变变质饲料禁止饲喂",cv::Point(20,40),cv::FONT_HERSHEY_SIMPLEX,0.7,cv::Scalar(0,0,255),2);

寒寒豆豆软件公司的博客 181

C语言实战:从零构建回合制LOL游戏,掌握模块化编程与数据结构

在计算机编程领域,结构体是组织和管理复杂数据的核心数据结构,它允许将不同类型的数据项组合成一个单一的逻辑单元,为构建更复杂的程序模型奠定基础。其原理在于通过自定义类型,将相关联的数据封装在一起,从而提升代码的可读性、可维护性和数据操作的效率。这种模块化设计思想的技术价值在于实现了高内聚、低耦合,是大型软件工程的基石。在游戏开发、系统软件等应用场景中,结构体常被用于模拟现实世界的实体,例如游戏中的角色。本文以C语言实现一个简易的回合制英雄对战程序为例,具体展示了如何运用结构体定义英雄属性,并结合指针进行内存操

weixin_34292402的博客 515

将 AMDP Function Implementations 讲透:从 SAP CDS View 表函数到 AMDP 方法的完整实战与最佳实践

AMDP函数实现:连接ABAP与HANA的高效桥梁 本文面向ABAP开发者,详细解析AMDP函数实现技术,帮助在SAP HANA环境中充分发挥数据库算力。核心内容包括: 技术价值:解决复杂计算场景(窗口函数、跨表聚合等)中Open SQL和CDS的局限性 两种实现类型:内部复用函数与CDS表函数实现,对比其声明规则和用途差异 关键语法要点:FOR TABLE FUNCTION绑定、只读约束、参数与返回类型自动生成机制 实战应用:以采购订单聚合为例,展示AMDP在实时报表中的性能优势 完整示例:提供基于航线数

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 381

C语言学生成绩管理系统:从数组、结构体到文件读写的综合实践

在计算机编程学习中,数据结构与算法是构建高效软件系统的基石。数组和结构体作为C语言中最基础的数据组织方式,能够清晰地管理内存并封装复杂数据。通过文件读写操作,程序可以实现数据持久化,这是从内存计算到实用软件的关键一步。这些技术的工程价值在于,它们能帮助开发者深入理解计算机底层运作机制,培养扎实的编程思维。在众多应用场景中,学生成绩管理系统是一个经典的综合实践项目,它要求开发者综合运用数组存储、结构体定义、排序算法和文件I/O。本文围绕这一主题,结合“c语言大作业开题报告”和“翁恺c语言练习题”等高频搜索内容

weixin_33901641的博客 389

基于Claude Code的 规范驱动开发(SDD)指南

传统的AI辅助开发,如同手工作坊,我们向AI描述想法,它给我们零散的部件,我们再手动打磨、组装。这个过程充满了不确定性、信息损耗和重复劳动。本指南将尝试引领您进入软件开发的“工业时代”。在这里,

形上得其象,形下合于数;阴阳自济,玄理自明。 2747

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

为什么你的concat结果总是出错?ignore_index的正确打开方式(附实战代码)

掌握Pandas concat的ignore_index参数,解决索引重复问题。适用于数据合并场景,通过重置索引避免混乱,提升数据处理效率。附实战代码演示核心用法与关键优势,助你轻松搞定数据拼接,值得收藏。

BytePulse的博客 806

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IndexError: list index out of range

IndexError: list index out of range

m0_73367097的博客 1753

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

别再手动改数组了!Simulink Assignment模块的3种实战用法(附代码对比)

本文深入解析Simulink Assignment模块在汽车电子控制单元(ECU)和电池管理系统(BMS)开发中的3种高阶用法,包括Index Mode选择、Initialize Output配置及多维度数组处理技巧。通过实际代码对比,揭示不同参数组合对执行效率和代码可读性的影响,帮助工程师优化信号向量更新操作,提升开发效率。

weixin_30527423的博客 442

Netcap扩展开发指南:编写自定义过滤器与Action模块的最佳实践

Netcap是一款强大的网络分析工具,支持通过扩展模块实现自定义功能。本文将详细介绍如何为Netcap开发自定义过滤器与Action模块,帮助开发者快速扩展工具功能,满足特定网络分析需求。 ## 扩展模块基础:过滤器与Action的核心作用 Netcap的扩展系统主要包含两类模块:**过滤器(Filter)** 和**动作(Action)**。过滤器用于筛选网络数据包,决定哪些流量需要被处理;

gitblog_00458的博客 812

Pandas reset_index()深度解析:索引重置的原理、风险与最佳实践

在Pandas数据处理中,索引(Index)并非简单行号,而是决定数据对齐、定位和计算语义的核心结构。reset_index()表面是重置行序操作,实则涉及索引降级、语义剥离与结构契约重构——其行为直接受索引类型(如DatetimeIndex、MultiIndex)和参数组合(drop、level、inplace)控制。理解该函数的关键在于把握‘索引即坐标系’这一设计哲学:时间索引重置后丢失freq将导致resample失效;多级索引未显式命名会生成level_0等歧义列名。它广泛应用于分组聚合展平、时间序

weixin_30753873的博客 337

表 t1 建立联合索引 (a, b, c),where a = ? and b = ? and c = ? 和 where a = ? 两者之间为什么有性能的差距

场景:表 t1 建立联合索引 (a, b, c),where a =?为了验证上述结论,我们做一个实验:表 t1 建立联合索引 (a、b、c),实际记录中,a 字段的索引区分度不高,但 b、c 字段的索引区分度很高,共 100W 条记录。从理论上来说(不考虑其它的特殊情况,比如由于数据量或频繁回表等原因导致的优化器不使用索引过滤),这两条查询都会走联合索引 (a, b, c)。是 MySQL 8.0.18 及以上版本引入的一个调试工具,用于分析 SQL 查询的实际执行过程。多了两重的条件过滤。

是谢添啊 1080
上一篇: 4.完成html文件读取|获取title|获取content|构建url|调试(C++)
下一篇: 6.编写正排索引切分字符串|倒排索引原理|引入jieba到项目(C++)
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值