10

可能重复:
有没有办法从 C++ 中区分文件?

我有很长的文本字符串,我希望对其进行比较和修补。给定字符串 a 和 b:

string a = ...;
string b = ...;

string a_diff_b = create_patch(a,b);
string a2 = apply_patch(a_diff_b, b);

assert(a == a2);

如果a_diff_b是人类可读的,那将是一个奖励。

实现这一点的一种方法是使用system(3)从其中调用diffpatchshell 命令diffutils并将它们传递给字符串。另一种方法是自己实现这些功能(我想原子地处理每一行,并使用标准编辑距离 n^3 算法逐行回溯)。

我想知道是否有人知道一个好的 Linux C 或 C++ 库可以在进程中完成这项工作?

4

3 回答 3

9

你可以用谷歌搜索 Myers Diff 算法的实现。(“O(ND)差分算法及其变体”)或解决“最长公共子序列”问题的库。

据我所知,C++ 中 diff/patch 的情况并不好 - 有几个库(包括diff match patchlibmba),但根据我的经验,它们要么记录不充分,要么具有严重的外部依赖(例如,差异匹配补丁需要 Qt 4)或专门用于您不需要的类型(例如,当您需要 unicode 时为 std::string),或者不够通用,或者使用具有非常高内存的通用算法要求((M+N)^2,其中 M 和 N 是输入序列的长度)。

You could also try to implement Myers algorithm ((N+M) memory requirements) yourself, but the solution of problem is extremely difficult to understand - expect to waste at least a week reading documentation. Somewhat human-readable explanation of Myers algorithm is available here.

于 2012-11-18T20:42:52.413 回答
8

我相信

https://github.com/cubicdaiya/dtl/wiki/Tutorial

可能有你需要的

于 2012-11-18T10:13:08.770 回答
3

http://code.google.com/p/google-diff-match-patch/

Diff Match 和 Patch 库提供了强大的算法来执行同步纯文本所需的操作。

目前可用于 Java、JavaScript、Dart、C++、C#、Objective C、Lua 和 Python。无论使用哪种语言,每个库都具有相同的 API 和相同的功能。所有版本还具有全面的测试工具。

于 2012-11-18T20:25:41.247 回答