C++ 为文本编辑控件实现缓冲区的最佳方法是什么?

C++ 为文本编辑控件实现缓冲区的最佳方法是什么?,c++,winapi,C++,Winapi,因此,我正在制作一个自定义编辑控件。为了跟踪编辑控件的内容,我使用了一个动态分配的字符数组 现在,我知道我需要插入数组的中间部分。 某些情况下,例如当用户单击特定的 指向所以,我在想,我可以使用 vector,所以我可以使用.insert函数 不必太在意内存管理 我还想直接将输入流存储到 字的数组/向量(不保留连续缓冲区),因为 这样做的全部目的是实现语法高亮显示 哪一种方法更好?为什么呢?您可能需要一个双重表示,因此需要一个字符向量和一个单词向量(问题是保持它们同步) 我建议您也可以查看,

因此,我正在制作一个自定义编辑控件。为了跟踪编辑控件的内容,我使用了一个动态分配的字符数组

    现在,我知道我需要插入数组的中间部分。 某些情况下,例如当用户单击特定的 指向所以,我在想,我可以使用 vector,所以我可以使用.insert函数 不必太在意内存管理
  • 我还想直接将输入流存储到 字的数组/向量(不保留连续缓冲区),因为 这样做的全部目的是实现语法高亮显示

哪一种方法更好?为什么呢?

您可能需要一个双重表示,因此需要一个字符向量和一个单词向量(问题是保持它们同步)

我建议您也可以查看,甚至可以使用一些图形工具包,这些工具包的源代码是免费的,并且可以定制。(我不是一个Windows家伙,但是)我在想,例如,它是一个开源的C++图形库,它运行在Windows、Linux、MaCOSx……p>
我无能为力,因为我不知道也不使用Windows(我所有的机器都在Linux下)。

对于今天计算机上的文本缓冲区,你确实可以只使用一个连续的缓冲区(例如向量),因为CPU的速度足够快,可以进行插入时间(这种天真的方法是
o(n)
操作)这仍然是一个可行的选择

在过去,当计算机的速度慢上千倍时,一种常见的简单方法是将文本保存在缓冲区中,但要有一个与光标位置相对应的“孔”,使插入成为一种
o(1)
操作,并在光标在文本中移动时将字符从孔的一侧移动到另一侧(基本上使光标移动成为
o(k)
操作,其中
k
是跳过的字符数)


对于为程序员设计的编辑器来说,文本将被细分为逻辑行,因此使用一种基于指向行的指针数组的方法似乎是合适的。即使这会使一些跨行操作有些烦人,一些基于行的操作也会变得更容易…显示中的行编号变得微不足道问题,特别是如果您不需要实现换行(无论如何代码都很糟糕)选择截断和水平滚动。

最好的方法是从系统编辑或richedit控件开始,并根据您的需要进行调整。编写自己的编辑控件比您可能实现的工作多得多,包括处理可访问性、具有复杂字母表的语言的IME、复制和粘贴、滚动条,光标,选择和更多

这两个系统控件提供了许多扩展点,应该可以让您实现大多数目标。除非您真的在构建word流程或源代码编辑器,否则您应该坚持使用提供的那些。自定义编辑控件是大量错误的来源。我很少看到仅适用于基本情况的控件


Martyn

如果您正在考虑像源代码查看器(参考:“实现语法突出显示”)这样的具有可变备份存储的东西,您可能会发现
std::list
是一个很好的起点,如果字符串很小,那么可能会有点过头

文本的连续缓冲区(例如一个大的
std::string
std::vector
),您将在编辑过程中进行大量移动和调整大小,以及在重新定位时进行大量扫描。这些移动和调整大小将导致大量连续的大型分配、缓冲区初始化、移动和释放旧内存。它还限制您缓存数据的方式(如果这很重要)。使用列表时,您的查找时间会稍慢一些,但移动和更改速度会比使用连续缓冲区处理整个文件快得多

std::list
有一些很好的属性,因为它作为字符串的集合(例如,对于每一行或每一段)很好地增长和变异

此概述详细介绍了该列表的优点,并将其与其他容器进行了比较:

如果要将某些数据与字符串/行关联,只需创建以下列表:

namespace MON {
class t_line {
public:
  /* ... */
private:
  std::string d_string;
  t_lexer_stuff d_lexerStuff;
};
}

在搜索同一个thin时,我发现两个Wikipedia页面非常有用:

用于简单编辑


对于复杂的文本编辑

感谢回复人!我一定会在我完成自己的事情后调查它们。我想了解所有的“幕后黑手”首先是内容。我还认为可能需要双重表示。这会影响性能/内存使用吗?保留字符向量和每个单词的位置向量如何?比如起始位置和长度(使用结构)?从性能角度看,这会更好吗?过早优化是有害的,所以首先编写一个正确的实现,使用探查器对其进行基准测试,然后对其进行优化。实际上,我只想了解我应该如何使用代码,这样我就不会在选择正确的方法很容易避免的情况下浪费时间啊problem@Basile,选择正确的数据表示并不是过早的优化。如果你盲目地选择数据结构和算法,你很容易发现自己的系统无法工作。这是一个非常好的解释,谢谢!是的,文本将被分成逻辑行,我将使用水平滚动。Ed使用一个连续缓冲区的编辑器在编辑大量文件(如日志文件)时会受到很大的影响。对于源文件来说,这很好,但人们不可避免地希望在编辑器中加载所有内容。因此需要进行某种分段。我正在构建一个源代码编辑器。我已经尝试过richedit,但对其进行子类化的速度没有以前快