Qt:实现git中diff的功能

2024-05-10 08:52
文章标签 实现 qt 功能 git diff

本文主要是介绍Qt:实现git中diff的功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 Git 中,有四种 diff 算法,即 Myers、Minimal、Patience 和 Histogram,用于获取位于两个不同 commit 中的两个相同文件的差异。

Myers算法实现参考:

Myers‘Diff之贪婪算法_myers算法-CSDN博客

Git Diff 算法详解:Myers Diff Algorithm-腾讯云开发者社区-腾讯云 (tencent.com)

Myers差分算法的理解、实现、可视化 - Oto_G - 博客园 (cnblogs.com)

最后找到一个c++可用的代码如下,在Myers函数中传入两个需要比较的文档内容。

#include <QDir>
#include <QVariantMap>
#include <QVariantList>
#include <QStringList>
#include <QList>
#include <QDebug>namespace ScriptManagerWebNew {
enum MoveType {MoveType_None,MoveType_Down,MoveType_Right,MoveType_Diagonal
};
struct Point {Point(int x, int y) {this->x = x;this->y = y;}bool operator== (const Point& pt) const {return this->x == pt.x && this->y == pt.y;}bool operator!= (const Point& pt) const {return this->x != pt.x || this->y != pt.y;}MoveType operator >(const Point& pt2) {if (this->x == pt2.x && this->y + 1 == pt2.y) {return MoveType_Down;}else if (this->y == pt2.y && this->x + 1 == pt2.x) {return MoveType_Right;}else if (this->x + 1 == pt2.x && this->y + 1 == pt2.y) {return MoveType_Diagonal;}return MoveType_None;}int x = 0;int y = 0;
};QString Myers(QString formerText, QString currentText)
{const auto lines = formerText.split("\n");const auto lines2 = currentText.split("\n");auto n = lines.size();auto m = lines2.size();std::vector<std::map<int, int>> Xlist;//只存储x坐标,y可以由k=x-y算出std::map<int,int> X;//假设起始点(0,-1)X[1] = 0;bool go_ahead = true;//步数d//从0开始,因为d=0时,也可能沿对角线前进for (int d = 0; d <= n + m && go_ahead; d++) {//k-lines: k has odd or even values according to an odd or even dfor (int k = -d; k <= d; k = k + 2) {//判断该从(d-1,k-1)向右走,还是从(d-1,k+1)向下走//当k!=d && k!=-d时, 可以从X[k + 1]向下走, 或者X[k - 1]向右走//具体怎么选择,判断x值:选择x大的,保证删除操作优于添加操作bool down = (k == -d || (k != d && X[k - 1] < X[k + 1]));int kPrev = down ? k + 1 : k - 1;//起始位置int xStart = X[kPrev];int yStart = xStart - kPrev;//中间位置int xTmp = down ? xStart : xStart + 1;int yTmp = xTmp - k;//此次move后的位置int xEnd = xTmp;int yEnd = yTmp;//判断能否总对角线(moving through a diagonal is free)while (xEnd < n && yEnd < m && lines[xEnd] == lines2[yEnd]) {++xEnd;++yEnd;}X[k] = xEnd;//到终点,找到了最短路线if (xEnd >= n && yEnd >= m) {go_ahead = false;break;}}Xlist.push_back(X);}//回退,从终点到起点,找出路线std::vector<Point> path; //move的路线Point pt(lines.length(), lines2.length());path.push_back(pt);for (int d = Xlist.size() - 1; pt.x > 0 || pt.y > 0; --d) {auto X = Xlist[d];int k = pt.x - pt.y;//结束位置int xEnd = X[k];int yEnd = pt.x - k;//结束位置前是否走的对角线while (xEnd > 0 && yEnd > 0 && xEnd <= n && yEnd <= m && lines[xEnd-1] == lines2[yEnd-1]) {--xEnd;--yEnd;path.push_back(Point(xEnd, yEnd));}//down可以确定上一步的k线,对角线上的移动不影响d和k//并且,Xlist[d][k-1] == Xlist[d-1][k-1]; Xlist[d][k+1] == Xlist[d-1][k+1]bool down = (k == -d || (k != d && X[k - 1] < X[k + 1]));int kPrev = down ? k + 1 : k - 1;//起始位置int xStart = X[kPrev];int yStart = xStart - kPrev;中间位置//int xTmp = down ? xStart : xStart + 1;//int yTmp = xTmp - k;path.push_back(Point(xStart, yStart));pt.x = xStart;pt.y = yStart;}path.pop_back();//path第一个点是假设的起点(0,-1);//文字描述path代表的操作QString stream;
//    std::stringstream stream;if (path.size() >= 2) {int size = path.size();for (int i = size - 2; i >= 0; --i) {Point prev_point = path[i+1];MoveType type = prev_point>(path[i]);switch (type) {case MoveType_Right: {stream.append("-" + lines[prev_point.x]+"\n");break;}case MoveType_Down: {stream.append( "+" + lines2[prev_point.y]+"\n");break;}case MoveType_Diagonal: {stream.append(lines[prev_point.x]+"\n");break;}}}}
//    std::cout << "最短编辑路线如下:" << std::endl;
//    std::cout << stream.str();
//    std::string input;
//    std::cin >> input;return stream;
}

这篇关于Qt:实现git中diff的功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975988

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的