Программирование. Принципы и практика использования C++ Исправленное издание, стр. 277
В стандарте класс
listtemplate<class Elem> class list {public: class Link; typedef unsigned long size_type; typedef Elem value_type; class iterator; // см. раздел 20.4.2 class const_iterator; // как iterator, но допускает изменение // элементов // ... iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; size_type size(); // ...};Таким образом, можно писать код, не беспокоясь о том, что он использует: класс
listvectoriteratorsize_type20.6. Пример: простой текстовый редактор
Какие операции? Допустим, документ будет храниться в основной памяти компьютера. Следовательно, можно выбрать любое удобное представление и просто превратить его в поток байтов, которые мы хотим хранить в файле. Аналогично, мы можем читать поток байтов из файла и превращать их в соответствующее представление в памяти компьютера. Решив этот вопрос, можем сконцентрироваться на выборе подходящего представления документа в памяти компьютера. По существу, это представление должно хорошо поддерживать пять операций.
• Создание документа из потока байтов, поступающих из потока ввода.
• Вставка одного или нескольких символов.
• Удаление одного или нескольких символов.
• Поиск строки.
• Генерирование потока байтов для вывода в файл или на экран.
В качестве простейшего представления можно выбрать класс
vector<char>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<char>hlist<Line>Linevector<char>
Теперь для вставки символа
tThis is the start of a very long document.
This is a new line.
There are lots of ...
Все, что нам для этого нужно, — добавить новую строку в середину.

Возможность вставки новых узлов без перемещения существующих узлов объясняется тем, что мы используем итераторы, ссылающиеся на эти узлы, или указатели (или ссылки), установленные на объекты в этих узлах. Эти итераторы и указатели не зависят от вставок и удалений строк. Например, в текстовом процессоре может использоваться объект класса
vector<list<Line>::iterator>Document
Мы можем добавить строки в “paragraph 20.2”, не нарушая целостности итератора, установленного “paragraph 20.3.”
В заключение отметим, что использование как списка строк, так и вектора всех символов имеет как логические, так и практические причины. Однако следует под- черкнуть, что ситуации, в которых эти причины становятся важными, являются настолько редкими, что правило “по умолчанию используйте класс
vectorlistvectorlistvectorvector20.6.1. Строки
Как решить, что такое строка в нашем документе? Есть три очевидные альтернативы.
1. Полагаться на индикаторы новых строк (например,
'\n'