Organizacja pamięci dla tekstu w programie typu notepad
Ostatnio zmodyfikowano 2018-11-06 00:44
Nazgul Temat założony przez niniejszego użytkownika |
Organizacja pamięci dla tekstu w programie typu notepad » 2018-11-05 05:02:24 Cześć, Jak w temacie, dodam jeszcze, że nie korzystam z winapi, Qt itp. a tekst trzymam w tablicy charów.
Zastanawiam się czy trzymanie tego w standardowym std::vector'ze będzie optymalne (przykład: mam zapisane 1000000 znaków, a dopisanie jednego znaku na samym początku wiąże się z milionem operacji przesuwania każdego z następnych o jeden dalej) ---- tak chyba działa też std::string
więc pozostaje std::list ; z dodawaniem tekstu gdziekolwiek nie ma problemu, ale.. znajdywanie miejsca między którymi znakami kliknął użytkownik już zaczyna być gorsze, do tego znacznie wzrasta zapotrzebowanie pamięci (na 64-bit systemie aż 9krotnie! (8bit char, 64bit *pnext))
jest jeszcze tablica dwuwymiarowa (std::vector<std::vector<char>>) gdzie pierwszym wymiarem byłby wiersz, a drugim index znaku w wierszu (text[lineIndex][charIndex])
Pomysł z tablicą dwuwymiarową wydaje mi się najlepszym pomysłem, ale wolałbym się upewnić, czy to właściwe podejście. Dlatego pytam bardziej doświadczonych. |
|
pekfos |
» 2018-11-05 08:30:53 Wciąż możesz mieć milion znaków w jednej linii. więc pozostaje std::list ; z dodawaniem tekstu gdziekolwiek nie ma problemu, ale.. znajdywanie miejsca między którymi znakami kliknął użytkownik już zaczyna być gorsze, do tego znacznie wzrasta zapotrzebowanie pamięci (na 64-bit systemie aż 9krotnie! (8bit char, 64bit *pnext)) |
Chyba zapominasz, że std::list jest listą podwójnie łączoną. Jakbyś zrobił listę wektorów, te kilka wskaźników nie będzie już takie straszne. Tylko musisz pilnować by żaden z wektorów nie przekroczył określonego progu. Np jeśli jakiś osiągnie 128k znaków, podziel go na dwa. Jakiś przypadek w podobnym stylu na scalanie dwóch wektorów. |
|
Nazgul Temat założony przez niniejszego użytkownika |
» 2018-11-06 00:44:12 haha okej, przynajmniej moje obawy że to jednak nie jest takie proste zostały potwierdzone;)
Pozostanę przy tablicy wektorów i dam jakiś rozsądny ogranicznik z maksymalną szerokością linii (nie będę dzielił na oddzielne vectory, żeby za bardzo nie komplikować funkcji renderującej tego tekstu)
Dzięki za pomoc;) |
|
« 1 » |