通常的方法是将字符存储在字符串中,但由于在编写文本时,很多时候用户删除或添加文本中间的字符,也许最好使用std::list<char>
来包含字符,那么在列表中间添加字符的操作成本并不高。
以下文章总结了文字处理器中使用的数据结构: http://www.cs.unm.edu/~crowley/papers/sds.pdf
文本序列的数据结构。 查尔斯·克劳利,新墨西哥大学,1998
年用于维护字符序列的数据结构是一个 文本编辑器的重要组成部分。本文对 文本序列可能的数据结构范围。The ADT 检查文本编辑器的文本序列组件的接口。 六种常见的序列数据结构(数组、间隙、列表、行指针、 固定尺寸的布尔斯和计件表)被检查,然后一般 包含所有六种结构的序列数据结构模型 呈现。详细解释了计件表方法及其 优点被呈现。序列数据结构的设计空间 进行了检查,上面列出的几种变体是 提出。通过实验比较这些序列数据结构 并根据一系列标准进行评估。实验性 通过在编辑中实现每个数据结构来进行比较 模拟器并使用数千个合成负载对其进行测试 编辑。我们还报告了关于结果敏感性的实验 用于生成合成编辑的参数的变化 负荷。
第一个文字处理不仅仅是字符串操作。您将需要一个富文本数据结构。如果您需要分页,您还需要一些元数据,例如页面设置。对Word做一些研究,你会有答案。
对于富文本部分,您的数据结构必须保存两件事:字符和属性。换句话说,你必须有某种标记语言。HTML/DOM 是一种选择。但在大多数情况下,由于复杂性,这是一种矫枉过正。
有许多数据结构可以处理字符部分:绳索,间隙缓冲区和片表。但它们都不直接提供属性支持。你必须自己建造它。
AbiWord以前使用基于列表的Piece Table,但现在使用基于树的Piece Table。转到AbiWord的Wiki页面,您将找到更多信息。
OpenOffice使用不同的方式。基本上,它保留一个段落列表,在段落内部它保留一个字符串(或其他更有效的数据结构)和属性列表。我更喜欢这种方式,因为段落是一个自然足够小的单元,可以编辑,它比基于树的片段表容易得多。
SGI STL有一个绳索类,你可能想看看:http://www.sgi.com/tech/stl/Rope.html
std::list<char>
每个字符需要的存储空间大约是使用 std::string
的九倍。这可能不是一个好的权衡。我的第一个倾向是使用std::vector<std::string>
,其中每个string
对象都包含段落的文本。段落中的插入和删除将足够快。