通常的方法是将字符存储在字符串中,但是因为在编写文本时,用户很多时候会在文本中间删除或添加字符,所以最好使用std::list<char>
包含字符,然后在列表中间添加字符并不是昂贵的操作。
答案 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
对象都包含段落的文本。段落中的插入和删除速度足够快。