Gap buffer
A buffer with a hole at the cursor.
A surprisingly simple structure that powers Emacs and several other editors. Allocate a buffer larger than needed; keep a "gap" of empty slots near where the cursor is. Inserts are O(1) at the cursor. Moving the cursor is O(distance moved) — but you only do that occasionally.
A linear buffer split into three parts: the bytes before the cursor, an empty gap, and the bytes after. Inserts fill the gap. Cursor movement memmoves bytes across the gap. When the gap fills, allocate a bigger buffer and reset the gap.
Emacs (since the 1970s). Notepad-like simple editors. The "single cursor" model maps perfectly.
Gap buffers are one O(distance) memmove per cursor jump — fine for typing, painful for "find & replace" across a 100 MB file. Ropes and piece tables are why modern editors stay fast on big files.