Хорошо ли std :: strings при случайной вставке / случайном удалении? - PullRequest
1 голос
/ 15 марта 2011

Я хочу сделать простой текстовый редактор, используя std :: strings. Если мой текст содержит 500 000 символов, и я хочу вставить или удалить 253 000-й символ, это будет медленно или будет так же быстро, как если бы мой текст содержал 10 символов? В противном случае я не уверен, что я сделаю, чтобы это исправить (если только я не использую связанный список, но тогда чтение идет медленно, и это своего рода переизобретение колеса.

Спасибо

Ответы [ 7 ]

5 голосов
/ 15 марта 2011

Я никогда не использовал его сам, но я верю, что именно для этого веревка .

1 голос
/ 15 марта 2011

На практике это, вероятно, будет "достаточно быстро".Тем не менее, я все еще написал бы класс EditBuffer, инкапсулируя его и предоставив этому новому классу интерфейс, настроенный для моего приложения.Таким образом, тот факт, что я использую std :: string, а не что-то другое, становится деталью реализации EditBuffer, которую можно изменить в любое время.(Возможно, вы захотите попробовать также std :: vector. И одна из наиболее распространенных оптимизаций - сохранить дыру в курсоре: текст за курсором находится в конце буфера. Перемещение курсора означает перемещение одного символа, но вставка обычнов постоянное время.)

1 голос
/ 15 марта 2011

Скорее всего, он будет медленным, поскольку должен копировать память. Это зависит от внутренней реализации вашей операционной системы / процессора и операций с памятью.

0 голосов
/ 07 апреля 2011

Я бы серьезно подумал о том, чтобы хранить текст не как одну большую строку, а как отдельные строки.std::list<std::string> или std::vector<std::string> может показаться уместным.Такой подход будет эффективно распределять вашу большую строку по нескольким более мелким, а перераспределение после модификации будет когда-либо происходить только для отдельной строки или для массива строк сама по себе.Единственный компромисс, который вам нужно выбрать, это между std :: vector и std :: list, хотя я бы предпочел использовать здесь std :: list.

Еще одно преимущество линейного подхода - чтениефайлы, вы можете легко читать построчно с std::getline и вам не придется заботиться о буферах чтения самостоятельно.

0 голосов
/ 15 марта 2011

Учитывая, что пропускная способность памяти указана в ГБ / с

http://en.wikipedia.org/wiki/DDR3_SDRAM

Сколько, по вашему мнению, займет копирование 256 КБ?

0 голосов
/ 15 марта 2011

Это неправильный тип.

Вставка (не в конце) в std :: string имеет сложность O (n).

Требуется структура средней сложности для вставки / удаления / изменения O (1).

есть. стоимость вставки не должна быть связана с размером данных.

0 голосов
/ 15 марта 2011

Вероятно, он будет медленным, хотя вам нужно будет проверить, достаточно ли он медленен, чтобы быть проблемой.Одна альтернативная реализация состоит в том, чтобы использовать список строк, по одной на строку текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...