我一直在使用文本編輯器一段時間。我從頭開始進行自定義編輯控制,現在我已經掌握了基本知識。我面臨的問題是關於生產線管理。因爲,我的程序依賴於將輸入文本分成行(文本逐行打印),所以行管理非常重要。我正在使用std :: vector來存儲行位置。我正在使用Piece Table進行文本處理,但爲了簡單起見,假設我有一組字符。每次用戶按下回車鍵時,我會在行向量中添加/插入一個元素。問題是每次用戶插入角色時,整個結構都會受到干擾。例如:文本編輯器中的行管理
0 1 2 3 4 5 6 7 8 9 10
text = ['h','e','l','l','o','\n','W','o','r','l','d']
state of line vector :
line[0] = 0
line[1] = 6
比方說用戶的文本[2]之後插入一個字符(「X」):
0 1 2 3 4 5 6 7 8 9 10 11
text = ['h','e','l','x','l','o','\n','W','o','r','l','d']
state of line vector :
line[0] = 0
line[1] = 6
由於插入的,我需要更新每個的值元素在當前行之後的行向量中。刪除也一樣。如果程序中有1000行,並且用戶編輯了第一行,那麼更新所有999個元素(第一行除外)的效率會非常低。
我在想什麼是保持每條線彼此獨立。但是,如果將現有的線路劃分爲兩條線路,這會導致複雜化。所以我想知道什麼是解決問題的好方法?
編輯: 只是爲了澄清,我使用的是一個名爲Piece Table的數據結構。我沒有使用字符數組。以下是一個表格數據結構: http://www.cs.unm.edu/~crowley/papers/sds.pdf
如果你想支持廉價的插入,明確的vector <>是數據結構的錯誤選擇。 O(n)複雜性。你有沒有考慮清單<>? –
@HansPassant @HansPassant如果你的意思是在列表中存儲一行元素,那麼從一行移動到另一行會很昂貴(雖然插入一行可能比從一行移動到另一行更爲常見) –
你還沒有真正的描述了你試圖解決的問題。例如,你需要O(1)訪問第N行還是O(N)呢? (如果是這樣,你可以簡單地保留向量中的行的長度,並在必要時添加它們。) – Neil