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

c++ cpp 多叉树简单处理文件重复包含问题

c++ cpp 多叉树简单处理文件重复包含问题

c++ 对于某些类型的文件集合,按照文件夹为一个单位进行处理,现在需要确保这些文件夹之间没有包含关系,因此需要通过某个方式来计算。

由于文件夹是一个目录树,因此可以很简单地把所有的文件路径都重建为原始的目录树,每个文件直接所在的文件夹都向上查找,直到末端结点,最后完成输出。

输入 从某个目录下 提取得到的所有的文件绝对路径。
输出,不是独立的叶子节点的文件夹,给出其路径。

win10 vs2019 v142 cpp17
代码是:


#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <filesystem>
#include <map>
#include <set>namespace fs = std::filesystem;// 路径分割结果结构体
struct PathParts {std::string directory;std::string filename;std::string extension;
};// 分割文件路径
PathParts get_path_list(const std::string& file_path) {fs::path path_obj(file_path);PathParts parts;parts.directory = path_obj.parent_path().string();parts.filename = path_obj.stem().string();parts.extension = path_obj.extension().string();return parts;
}// 节点类
class node_class {
public:std::vector<std::string> path_list;  // 当前节点的路径部分std::vector<node_class*> child_list; // 子节点列表node_class* father_node;             // 父节点std::string path;bool is_ok;int pass_count;  // 经过该节点的路径数量// 构造函数node_class() : father_node(nullptr), is_ok(false), pass_count(0) {}// 析构函数~node_class() {for (auto child : child_list) {delete child;}}
};// 树类
class tree_class {
public:std::vector<std::string> path_ok_dict;std::map<std::string, bool> path_no_dict;std::vector<node_class*> node_list;node_class* root;std::vector<std::string> ft_file_ft_list;std::map<std::string, bool> main_dict;// 构造函数tree_class() {root = new node_class();root->path = "";}// 析构函数~tree_class() {delete root;}// 解析路径列表,构建多叉树结构void parse(const std::vector<std::string>& path_list) {ft_file_ft_list.clear();// 标准化路径:统一使用正斜杠,去除末尾分隔符std::vector<std::string> normalized_paths;for (const auto& path : path_list) {std::string normalized = path;std::replace(normalized.begin(), normalized.end(), '\\', '/');if (!normalized.empty() && normalized.back() == '/') {normalized.pop_back();}normalized_paths.push_back(normalized);}ft_file_ft_list = normalized_paths;// 按路径长度排序,确保先处理短路径std::sort(normalized_paths.begin(), normalized_paths.end(),[](const std::string& a, const std::string& b) {size_t count_a = std::count(a.begin(), a.end(), '/');size_t count_b = std::count(b.begin(), b.end(), '/');return count_a < count_b;});// 构建树结构for (const auto& path : normalized_paths) {std::vector<std::string> parts;size_t start = 0;size_t end = path.find('/');while (end != std::string::npos) {parts.push_back(path.substr(start, end - start));start = end + 1;end = path.find('/', start);}parts.push_back(path.substr(start));std::string name = parts.back();std::cout << "paths ";for (const auto& part : parts) {std::cout << part << " ";}std::cout << std::endl;node_class* current_node = root;// 逐级处理路径部分 特别注意没有 末尾的文件名字哦,这里创建的只有文件夹的名字for (size_t i = 0; i < parts.size() - 1; i++) {const auto& part = parts[i];bool found = false;// 检查当前节点是否已有该子节点for (auto child : current_node->child_list) {if (child->path == part) {current_node = child;found = true;break;}}// 如果没有找到,创建新节点if (!found) {node_class* new_node = new node_class();new_node->path = part;new_node->father_node = current_node;current_node->child_list.push_back(new_node);current_node = new_node;}}// 处理文件名部分current_node->path_list.push_back(path);node_list.push_back(current_node);}}// 设置节点状态void set_false_fuc() {get_get_data_fuc();}// 初始化节点状态并检查路径void get_get_data_fuc() {std::cout << "node_list len " << node_list.size() << std::endl;for (auto node : node_list) {std::cout << "当前的类型 " << node->path << " ";for (const auto& p : node->path_list) {std::cout << p << " ";}std::cout << std::endl;// 向上查找if (node->path_list.size() != 1) {node->is_ok = true;}// 向上查找,如果找到了,就设置为truenode_class* current_node = node;while (current_node->father_node != nullptr) {std::cout << "current_node " << current_node->is_ok << " " << current_node->path << std::endl;current_node = current_node->father_node;current_node->is_ok = true;}}}// 获取有效和无效路径列表void get_ok_no_fuc(std::vector<std::string>& ok_list, std::vector<std::string>& no_list) {path_no_dict.clear();path_ok_dict.clear();main_dict.clear();// 初始化主字典for (const auto& path : ft_file_ft_list) {main_dict[path] = false;}// 遍历树并设置主字典print_tree3();// 分离有效和无效路径for (const auto& pair : main_dict) {if (pair.second) {ok_list.push_back(pair.first);} else {no_list.push_back(pair.first);}}}// 遍历树并设置主字典值void print_tree3(node_class* node = nullptr, int level = 0) {if (node == nullptr) {node = root;}std::string indent(level * 2, ' ');for (const auto& path : node->path_list) {if (node != root) {if(node->is_ok){std::cout << "sign   " << node->is_ok << " "<< (node->father_node ? node->father_node->is_ok : false)<< " " << node->path << std::endl;main_dict[path] = node->father_node ? node->father_node->is_ok : false;}}}for (auto child : node->child_list) {print_tree3(child, level + 1);}}// 打印树结构(用于调试)void print_tree(node_class* node = nullptr, int level = 0) {if (node == nullptr) {node = root;}std::string indent(level * 2, ' ');std::cout << "node3---->" << node->is_ok << " " << indent << " " << node->path << std::endl;for (auto child : node->child_list) {print_tree(child, level + 1);}}
};// 主函数示例
int main() {// 示例文件路径列表std::vector<std::string> ft_file_ft_list ={"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\10\\10.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\11\\11.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\12\\12.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\13\\13.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\14\\14.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\15\\15.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\16\\16.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\17\\17.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\18\\18.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\19\\19.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\20\\20.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\21\\21.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\22\\22.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\23\\23.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\24\\24.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\25\\25.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\26\\26.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\27\\27.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\28\\28.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\29\\29.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\30\\30.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\31\\31.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\32\\32.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\33\\33.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\34\\34.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\35\\35.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\36\\36.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\37\\37.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\38\\38.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\39\\39.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\40\\40.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\41\\41.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\42\\42.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\43\\43.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\44\\44.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\45\\45.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\46\\46.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\47\\47.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\48\\48.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\49\\49.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\5\\5.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\5\\1\\1.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\5\\2\\2.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\5\\3\\3.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\5\\4\\4.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\5\\4\\10\\10.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\50\\50.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\51、\\51.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\52、\\52.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\53、\\53.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\54、\\54.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\55、\\55.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\56、\\56.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\57、\\57.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\58、\\58.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\59、\\59.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\6\\6.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\60、\\60.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\61、\\61.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\62、\\62.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\63\\63.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\64\\64.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\65\\65.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\66\\66.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\67\\67.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\68\\68.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\69\\69.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\7\\7.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\70\\70.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\71\\71.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\72\\72.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\73\\73.YFJT", "C:\\Users\\Administrator\\Desktop\\data\\读取文件\\74\\74.YFJT",
"C:\\Users\\Administrator\\Desktop\\data\\读取文件\\8\\8.YFJT"};// 创建树对象并解析路径tree_class tree_obj;tree_obj.parse(ft_file_ft_list);// 打印树结构(调试用)std::cout << "文件路径树结构:" << std::endl;tree_obj.print_tree();// 设置节点状态tree_obj.set_false_fuc();// 获取有效和无效路径列表std::vector<std::string> no_list, ok_list;tree_obj.get_ok_no_fuc(no_list, ok_list);// 输出结果for (const auto& path_ok : ok_list) {std::cout << "ok " << path_ok << std::endl;}for (const auto& path_no : no_list) {std::cout << "no " << path_no << std::endl;}return 0;
}

文章转载自:

http://ZmXG85jP.tLyms.cn
http://yfgRnbVr.tLyms.cn
http://uEaBnlNE.tLyms.cn
http://UXdAT4L7.tLyms.cn
http://DpciHHhN.tLyms.cn
http://5oD5MhMz.tLyms.cn
http://KYQQbXFM.tLyms.cn
http://4RKaJB7f.tLyms.cn
http://c4XfueAi.tLyms.cn
http://ZfCj6j5J.tLyms.cn
http://4gZARifZ.tLyms.cn
http://rbP1hwO2.tLyms.cn
http://9yCT5470.tLyms.cn
http://EoHQL9tH.tLyms.cn
http://vsTH9VMw.tLyms.cn
http://Bq5DDk6A.tLyms.cn
http://5MjATEYs.tLyms.cn
http://XpBwkoCK.tLyms.cn
http://AX9RUIC6.tLyms.cn
http://QpAN2l3Q.tLyms.cn
http://bLxuzWCP.tLyms.cn
http://ZwznwprZ.tLyms.cn
http://w7RnWIb3.tLyms.cn
http://EmlPdv1v.tLyms.cn
http://KflEBsQQ.tLyms.cn
http://dQ0RaoeA.tLyms.cn
http://a8mk4KzW.tLyms.cn
http://FSm9RDLf.tLyms.cn
http://SgkGSsDT.tLyms.cn
http://yi3jroNW.tLyms.cn
http://www.dtcms.com/a/380701.html

相关文章:

  • YOLO系列目标检测模型演进与YOLOv13深度解析
  • 【基础知识】仿函数与匿名函数对比
  • 澳鹏数据集月度精选 | 覆盖全模态理解、复杂推理、海量真题的快速部署方案
  • 2025年- H136-Lc191.位1的个数(位运算)--Java版
  • 第五节 JavaScript——引用类型、DOM/BOM 与异步编程
  • 基础算法之二分算法 --- 2
  • Vue3+JS 复杂表单实战:从验证到性能优化的全流程方案
  • 基于RAG的智能客服系统
  • 建自己的Python项目仓库,使用工具:GitHub(远程仓库)、GitHub Desktop(版本控制工具)、VSCode(代码编辑器)
  • 容器使用卷
  • Vue3:根据el-input封装全局v-focus指令
  • 企业AI战略构建与成品选择指南
  • Semaphore和CountDownLatch
  • 实战ELK与AI MCP:构建高可用的智能化日志可观测体系
  • SAP-MM:SAP MM学习分享:深入浅出解析物料需求计划(MRP)及MRP配置图解
  • 【LLM】使用 Google ADK、Gemini、QDrant 和 MCP 构建深度研究系统
  • 【CSS学习笔记2】-css复合选择器
  • 186. Java 模式匹配 - Java 21 新特性:Record Pattern(记录模式匹配)
  • Electron下载失败
  • Origin绘制双Y轴网格叠加图|科研论文图表教程(附数据排列格式)
  • XXL-JOB框架SRC高频漏洞分析总结
  • 未启用Spring事务管理 执行mapper.xml文件的sql,为什么会自动提交
  • 亚马逊云代理:亚马逊云怎么样进行大规模数据分析与处理?
  • Linux防火墙iptables
  • 基于联邦学习与神经架构搜索的可泛化重建:用于加速磁共振成像|文献速递-最新医学人工智能文献
  • 如何将 Wine 应用包转换成玲珑格式包:完整技术教程
  • 函数库 动静态库
  • EPC企业如何通过数字化管理提高盈利能力?
  • P2678 [NOIP 2015 提高组] 跳石头
  • 旋转位置编码的论文阅读