Важным свойством списка является возможность вставлять и удалять элементы без перемещения других элементов списка. Исследуем простой пример, иллюстрирующий этот факт. Посмотрим, как представить символы в текстовом документе в простом текстовом редакторе. Это представление должно быть таким, чтобы операции над документом стали простыми и по возможности эффективными.
Какие операции? Допустим, документ будет храниться в основной памяти компьютера. Следовательно, можно выбрать любое удобное представление и просто превратить его в поток байтов, которые мы хотим хранить в файле. Аналогично, мы можем читать поток байтов из файла и превращать их в соответствующее представление в памяти компьютера. Решив этот вопрос, можем сконцентрироваться на выборе подходящего представления документа в памяти компьютера. По существу, это представление должно хорошо поддерживать пять операций.
• Создание документа из потока байтов, поступающих из потока ввода.
• Вставка одного или нескольких символов.
• Удаление одного или нескольких символов.
• Поиск строки.
• Генерирование потока байтов для вывода в файл или на экран.
Символы в документе
В качестве простейшего представления можно выбрать класс vector. Однако, чтобы добавить или удалить символ в векторе, нам пришлось бы переместить все последующие символы в документе. Рассмотрим пример.
This is he start of a very long document.
There are lots of . . .
Мы могли бы добавить недостающий символ t и получить следующий текст:
This is the start of a very long document.
There are lots of . . .
Однако, если бы эти символы хранились в отдельном объекте класса vector, мы должны были бы переместить все символы, начиная с буквы h на одну позицию вправо. Для этого пришлось бы копировать много символов. По существу, для документа, состоящего из 70 тыс. символов, при вставке или удалении символа в среднем нам пришлось бы переместить 35 тыс. символов. В результате временная задержка стала бы заметной и досадной для пользователей. Вследствие этого мы решили разбить наше представление на “порции” и изменять часть документа так, чтобы не перемещать большие массивы символов. Мы представим документ в виде списка строк с помощью класса list, где шаблонный параметр Line — это класс vector. Рассмотрим пример.
Теперь для вставки символа t достаточно переместить только остальные символы из этой строки. Более того, при необходимости можем добавить новую строку без перемещения каких-либо символов. Для примера рассмотрим вставку строки “This is a new line.” после слова “document.”.
Также возможно вы думаете, что такая тема как http://www.arendasound.ru/service/arenda-video никак не связана и даже не тематична с программированием.
Возможно, это и так, но все-таки зайдите на сайт arendasound.ru - там можно узнать много интересного про то, где есть аренда видеооборудования в Москве. Что означает аренда видеооборудования в Москве, за сколько денег возможна аренда видеооборудования в Москве - про это написано на сайте arendasound.ru. Это важная для многих тема - аренда видеооборудования в Москве. Спасибо сайту arendasound.ru за информацию про то, где есть аренда видеооборудования в Москве
Возможность вставки новых узлов без перемещения существующих узлов объясняется тем, что мы используем итераторы, ссылающиеся на эти узлы, или указатели (или ссылки), установленные на объекты в этих узлах. Эти итераторы и указатели не зависят от вставок и удалений строк. Например, в текстовом процессоре может использоваться объект класса vector::iterator>, в котором хранятся итераторы, установленные на начало каждого заголовка и подзаголовка из текущего объекта класса Document.
Мы можем добавить строки в “paragraph 20.2”, не нарушая целостности итератора, установленного “paragraph 20.3.”
В заключение отметим, что использование как списка строк, так и вектора всех символов имеет как логические, так и практические причины.
Однако следует подчеркнуть, что ситуации, в которых эти причины становятся важными, являются настолько редкими, что правило “по умолчанию используйте класс vector” по- прежнему действует. Нужна особая причина, чтобы предпочесть класс list классу vector, — даже, если вы представляете свои данные только в виде списка!
Список — это логическое понятие, которое в вашей программе можно представить с помощью как класса list (связанного списка), так и класса vector. В библиотеке STL ближайшим аналогом нашего бытового представления о списке (например, список дел, товаров или расписание) является последовательность, а большинство последовательностей лучше всего представлять с помощью класса vector.
Опубликовал katy
April 22 2015 12:14:47 ·
0 Комментариев ·
3526 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.