为文字处理器存储文本的更好方法是啥?
Posted
技术标签:
【中文标题】为文字处理器存储文本的更好方法是啥?【英文标题】:What's a better way to store text for a word processor?为文字处理器存储文本的更好方法是什么? 【发布时间】:2013-01-07 00:10:06 【问题描述】:通常的方式是将字符存储在一个字符串中,但是因为在编写文本时,很多时候用户在文本中间删除或添加字符,也许使用std::list<char>
来包含更好字符,然后在列表中间添加字符不是昂贵的操作。
【问题讨论】:
我知道的替代方案包括 ropes 和 gap buffers。 我总是说配置文件,但在这种情况下,我认为std::list<char>
会更慢。不过,您可能会对 std::list<:string> 感到高兴。
你怎么知道通常的方式是什么?
我的意思是第一个自然趋势。
对于文字处理器或文本编辑器?如果是文本编辑器,那我指给你***.com/questions/3169440/text-editor-theory/…
【参考方案1】:
以下论文总结了字处理器中使用的数据结构:http://www.cs.unm.edu/~crowley/papers/sds.pdf
文本序列的数据结构。 查尔斯·克劳利,新墨西哥大学,1998 年
用于维护字符序列的数据结构是 文本编辑器的重要组成部分。本文调查和评估 文本序列的可能数据结构的范围。 ADT 检查文本编辑器的文本序列组件的接口。 六种常见的序列数据结构(数组、间隙、列表、行指针、 固定大小的 buers 和计件表)进行检查,然后一般 包含所有六种结构的序列数据结构模型 被呈现。计件表法详细说明及其 优势呈现。序列数据结构的设计空间 进行了检查,上面列出的几个变体是 提出了。这些序列数据结构进行了实验比较 并根据多项标准进行评估。实验 比较是通过在编辑中实现每个数据结构来完成的 模拟器并使用数千个合成负载对其进行测试 编辑。我们还报告了关于结果敏感性的实验 用于生成合成编辑的参数的变化 加载。
【讨论】:
您可能应该总结论文以使您的答案完整。就像现在一样,它只是一个不鼓励使用的链接答案。 而且主要是因为论文的长度【参考方案2】:第一个文字处理不仅仅是字符串操作。您将需要一个富文本数据结构。如果您需要分页,您还需要一些元数据,例如页面设置。对Word做一些研究,你会得到答案。
对于富文本部分,您的数据结构必须保存两件事:字符和属性。换句话说,你必须有某种标记语言。 html/DOM 是一种选择。但在大多数情况下,由于复杂性,这是一种矫枉过正的做法。
有很多数据结构可以处理字符部分:绳索、间隙缓冲区和块表。但是它们都没有直接提供属性支持。你必须自己建造它。
AbiWord 以前使用基于列表的 Piece Table,但现在使用基于树的 Piece Table。转到 AbiWord 的 Wiki 页面,您会发现更多信息。
OpenOffice 使用不同的方式。基本上,它保存一个段落列表,并且在段落内部保存一个字符串(或其他更有效的数据结构)和属性列表。我更喜欢这种方式,因为段落自然是一个足够小的编辑单元,它比基于树的块表要容易得多。
【讨论】:
【参考方案3】:SGI STL 有一个 Rope 类,你可能想检查一下: http://www.sgi.com/tech/stl/Rope.html
【讨论】:
【参考方案4】:使用std::list<char>
与使用std::string
相比,每个字符需要大约九倍的存储空间。这可能不是一个好的权衡。我的第一个倾向是使用std::vector<std::string>
,其中每个string
对象都包含一个段落的文本。段落内的插入和删除将足够快。
【讨论】:
以上是关于为文字处理器存储文本的更好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章