C++
Функция build использует библиотеку lost ream для ввода слов по одному:
Строка buf будет расти по мере надобности, чтобы в ней помещались вводимые слова произвольной длины.
В функции add более явно видны преимущества использования STL:
Как вы видите, выражения выглядят совсем не сложно; происходящее "за кулисами" тоже вполне доступно пониманию простого смертного. Контейнер map переопределяет доступ по индексу (операцию [ ]) для того, чтобы он работал как операция поиска. Выражение statetab[prefix] осуществляет поиск в statetab по ключу prefix и возвращает ссылку на искомое значение; если вектора еще не существует, то создается новый. Функция push_back – такая функция-член класса имеется и в vector, и в deque – добавляет новую строку в конец вектора или дека; pop_front удаляет ("выталкивает") первый элемент из дека.
Генерация результирующего текста осуществляется практически так же, как и в предыдущих версиях:
Итак, в результате именно эта версия выглядит наиболее понятно и элегантно – код компактен, структура данных ясно видна, а алгоритм абсолютно прозрачен. Но, как и за все хорошее в жизни, за это надо платить – данная версия работает гораздо медленнее, чем версия, написанная на С; правда, это все же не самый медленный вариант. Вопросы измерения производительности мы вскоре обсудим.
Упражнение 3.5
Одно из главных преимуществ использования STL состоит в той простоте, благодаря которой можно экспериментировать с различными структурами данных. Попробуйте изменить эту версию, используя различные структуры данных для префиксов, списка суффиксов и таблицы состояний. Посмотрите, как при этом изменяется производительность.
Упражнение 3.6
Перепишите программу на C++ так, чтобы в ней использовались только классы и тип данных string – без каких-либо дополнительных библиотечных средств. Сравните то, что у вас получится, по стилю кода и скорости работы с нашей STL-версией.