Linux C或C ++库来区分和修补字符串?

时间:2012-11-18 08:18:27

标签: c++ c linux algorithm diff

  

可能重复:
  Is there a way to diff files from 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)diff调用patchdiffutils shell命令并将它们管道化。另一种方法是自己实现这些功能(我正在考虑原子地处理每一行并使用标准的编辑距离n ^ 3算法逐行回溯)。

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

3 个答案:

答案 0 :(得分:7)

我相信

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

可能有你需要的东西

答案 1 :(得分:7)

你可以谷歌实施迈尔斯差异算法。 (“一个O(ND)差分算法及其变化”)或解决“最长公共子序列”问题的库。

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

您也可以尝试自己实施Myers算法((N + M)内存要求),但问题的解决方案极难理解 - 预计会浪费至少一周的阅读文档。 Myers算法有一些人类可读的解释here

答案 2 :(得分:3)

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

  

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

     

目前提供Java,JavaScript,Dart,C ++,C#,Objective C,Lua和Python。无论语言如何,每个库都具有相同的API和相同的功能。所有版本都有全面的测试工具。

相关问题