4

在此处输入图像描述

我正在阅读如何从头开始制作文本编辑器。我遇到了各种不同的数据结构,例如间隙缓冲区、块表和绳索。我可以理解其他人在实践中的工作方式,并且我了解绳索的好处以及它在后勤方面的工作方式。但是,我不明白编辑器如何实际使用绳索。让我解释。

假设我有一个新文件并输入“Hello world!”。我会想象每次按键编辑都会处理每个字符。但是,从程序逻辑方面来看,我看不到处理每个新字符的明显方法。据我了解,rope 很有用,因为树结构允许相对低成本的搜索、插入、追加和删除。但是,如果我正在逐个字符地处理输入,我应该有:

  1. 每个节点都是一个字符
  2. 让每个节点保存 X 个字符
  3. 每个节点都是一个完整的单词,节点以空格分隔
  4. 每 X 次输入的每个字符都进入一个节点
  5. 我还没有想到的东西

第一个选项虽然很容易实现,但似乎没有多大意义,我不认为最好地利用绳索结构。第二个选项似乎只是通过附加到节点内的字符串直到它达到 X 长度来使用一半的绳索。第三个选项与第二个选项有相同的问题,但至少不会在某个设定长度处破坏字符串。选项 4 将给出与我在大多数绳索示例图中看到的结果相似的结果,但在实施级别似乎是一场噩梦。

TL;DR:在文本编辑器中使用绳索时,理想情况下应该在按下一个键和该字符出现在树中之间发生什么?伪代码或只是高级解释在这里就足够了。

4

2 回答 2

1

正如我看到 ROPE 的实现,它遵循选项 2。您可以检查以下实现。(它不是精确的文本编辑器实现) https://www.geeksforgeeks.org/ropes-data-structure-fast-string-concatenation/

我建议检查下面的链接并检查文本编辑器的块表数据结构。 http://www.averylaird.com/programming/the%20text%20editor/2017/09/30/the-piece-table/

于 2018-01-06T17:56:21.277 回答
0

在查看了现有的绳索实现之后,看起来选项 2 是它在文本编辑器中的实际使用方式。

于 2017-10-10T00:22:46.907 回答