我使用ncurses启动了一个实验代码编辑器。我正在使用双链表来存储/解析/打印文本。即使我已经深入实现,我还没有完全决定使用双链表是否是最好的想法(而不是使用数组)。
请注意,当我指的是数组时,我的意思是每行一个字符数组 - 而不是单个线性数组。
以下是我权衡利弊的方法:
双重链接列表:
阵列:
注意:
阵列的打印速度更快,因为只需要一次打印printw
即可打印整行。与每个角色调用printw
相反。
答案 0 :(得分:1)
将评论转移到答案中,因为没有其他人正在切入。
为什么不使用(双向链接)字符串列表,其中列表中的每个项目都是一行,因此您可以像每个数组一样调用printw()
一行?您还可以大幅降低存储需求;在64位计算机上,单个字符的双向链表可能会使用每个字符24个字节,这是一个相当高的开销。
我实际上刚刚开始这样做。它似乎是一个相当不错的妥协(我有预感,这是纳米使用的)。我可能会删除这个问题,因为我认为这是我将要解决的问题。另外,在每次插入/删除时都使用
realloc()
是个坏主意吗?
我可能会按以下方式设计列表节点:
struct Line
{
struct Line *next;
struct Line *prev;
char *line;
size_t line_len;
size_t line_max;
};
line_len
记录当前行长度,line_max
记录分配的空间。
删除字符时我不会调用realloc()
;除非在实际尺寸和最大尺寸之间存在相当大的(256字节?)差异,否则我可能不会这样做。
对于插入,我只会在没有空格时重新分配(当line_len == line_max
时,但要注意一个一个)并且我将以至少16个字符的增量分配(因为这可能是无论如何malloc()
等实际分配的最小金额,加上当用户插入一个字符时,他们经常插入几个字符)。因此,您希望避免每个字符更改内存分配(调用realloc()
),而不必担心在必要时重新分配。