我一直在使用文本编辑器一段时间。我从头开始进行自定义编辑控制,现在我已经掌握了基本知识。我面临的问题是关于生产线管理。因为,我的程序依赖于将输入文本分成行(文本逐行打印),所以行管理非常重要。我正在使用std :: vector来存储行位置。我正在使用Piece Table进行文本处理,但为了简单起见,假设我有一组字符。每次用户按下回车键时,我会在行向量中添加/插入一个元素。问题是每次用户插入角色时,整个结构都会受到干扰。例如:文本编辑器中的行管理
0 1 2 3 4 5 6 7 8 9 10
text = ['h','e','l','l','o','\n','W','o','r','l','d']
state of line vector :
line[0] = 0
line[1] = 6
比方说用户的文本[2]之后插入一个字符(“X”):
0 1 2 3 4 5 6 7 8 9 10 11
text = ['h','e','l','x','l','o','\n','W','o','r','l','d']
state of line vector :
line[0] = 0
line[1] = 6
由于插入的,我需要更新每个的值元素在当前行之后的行向量中。删除也一样。如果程序中有1000行,并且用户编辑了第一行,那么更新所有999个元素(第一行除外)的效率会非常低。
我在想什么是保持每条线彼此独立。但是,如果将现有的线路划分为两条线路,这会导致复杂化。所以我想知道什么是解决问题的好方法?
编辑: 只是为了澄清,我使用的是一个名为Piece Table的数据结构。我没有使用字符数组。以下是一个表格数据结构: http://www.cs.unm.edu/~crowley/papers/sds.pdf
如果你想支持廉价的插入,明确的vector <>是数据结构的错误选择。 O(n)复杂性。你有没有考虑清单<>? –
@HansPassant @HansPassant如果你的意思是在列表中存储一行元素,那么从一行移动到另一行会很昂贵(虽然插入一行可能比从一行移动到另一行更为常见) –
你还没有真正的描述了你试图解决的问题。例如,你需要O(1)访问第N行还是O(N)呢? (如果是这样,你可以简单地保留向量中的行的长度,并在必要时添加它们。) – Neil