【问题标题】:What's a better way to store text for a word processor?为文字处理器存储文本的更好方法是什么?
【发布时间】:2013-01-07 00:10:06
【问题描述】:

通常的方式是将字符存储在一个字符串中,但是因为在编写文本时,很多时候用户在文本中间删除或添加字符,也许使用std::list<char>来包含更好字符,然后在列表中间添加字符不是昂贵的操作。

【问题讨论】:

  • 我知道的替代方案包括 ropesgap buffers
  • 我总是说配置文件,但在这种情况下,我认为std::list&lt;char&gt; 会更慢。不过,您可能会对 std::list<:string> 感到高兴。
  • 你怎么知道通常的方式是什么?
  • 我的意思是第一个自然趋势。
  • 对于文字处理器或文本编辑器?如果是文本编辑器,那我指给你stackoverflow.com/questions/3169440/text-editor-theory/…

标签: c++ text word-processor


【解决方案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&lt;char&gt; 与使用std::string 相比,每个字符需要大约九倍的存储空间。这可能不是一个好的权衡。我的第一个倾向是使用std::vector&lt;std::string&gt;,其中每个string 对象都包含一个段落的文本。段落内的插入和删除将足够快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-25
        • 2010-11-04
        • 1970-01-01
        • 2016-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多