Но и без доступа к отдельным символам нам не обойтись, нам нужна проверка орфографии, приставки, окончания и другая морфология. Следовательно и хранить все эти данные необходимо отдельно, символы, слова, предложения и абзацы, но создавать столько хранилищ довольно опрометчиво. Правило гласит, данные не должны дублироваться. Поэтому отбросив остальные контейнеры языка C++, остановимся на динамическом массиве (vector), который будет хранить символы. Динамический массив ссылается через итератор, а не через позиции, как контейнер строк, не понадобится постоянного пересчета. Контейнер с символами является основой, другие контейнеры дополняют. Они/он будут хранить ссылки на массив с символами, в таких местах где находятся слова, предложения и абзацы.