存储文字处理器文本的更好方法是什么?

时间:2013-01-23 13:33:34

标签: c++ text word-processor

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

4 个答案:

答案 0 :(得分:3)

以下文章总结了文字处理程序中使用的数据结构:http://www.cs.unm.edu/~crowley/papers/sds.pdf

  

文本序列的数据结构。   查尔斯克劳利,新墨西哥大学,1998年

     

用于维护字符序列的数据结构是   文本编辑器的重要部分。本文对此进行了调查和评估   文本序列的可能数据结构范围。 ADT   检查文本编辑器的文本序列组件的接口。   六种常见的序列数据结构(数组,间隙,列表,行指针,   检查固定大小的buers和piece table)然后检查一般情况   包含所有六种结构的序列数据结构的模型   被表达。详细解释了片表方法及其方法   提出了优点。序列数据结构的设计空间   检查了上面列出的几个变种   呈现。通过实验比较这些序列数据结构   并根据许多标准进行评估。实验   通过在编辑中实现每个数据结构来完成比较   模拟器并使用数千个合成负载进行测试   编辑。我们还报告了关于结果敏感性的实验   用于生成合成编辑的参数的变化   负荷。

答案 1 :(得分:1)

第一个字处理比字符串操作更有用。您将需要一个富文本数据结构。如果您需要分页,您还需要一些元数据,如页面设置。做一些关于Word的研究,你会得到答案。

对于富文本部分,您的数据结构必须保存两件事:字符和属性。换句话说,你必须有某种标记语言。 HTML / DOM是一种选择。但在大多数情况下,由于复杂性,这是一种过度杀伤力。

有许多数据结构可以处理字符部分:Rope,Gap Buffer和Piece Table。但它们都没有直接提供属性支持。你必须自己建造它。

AbiWord之前使用基于列表的Piece Table,但现在使用基于树的Piece Table。转到AbiWord的Wiki页面,你会发现更多。

OpenOffice使用不同的方式。基本上,它保留了段落列表,并在段落内部保留了一个字符串(或其他更有效的数据结构)和属性列表。我更喜欢这种方式,因为Paragraph是一个自然足够小的编辑单元,它比基于树的单件表更容易。

答案 2 :(得分:0)

SGI STL有一个Rope类,您可能需要查看它: http://www.sgi.com/tech/stl/Rope.html

答案 3 :(得分:-1)

使用std::list<char>每个字符的存储空间大约是使用std::string的九倍。这可能不是一个很好的权衡。我的第一个倾向是使用std::vector<std::string>,其中每个string对象都包含段落的文本。段落中的插入和删除速度足够快。