Программирование. Принципы и практика использования C++ Исправленное издание, стр. 272

Говоря так о данных, мы подразумеваем много разных данных: десятки фигур, сотни значений температуры, тысячи регистрационных записей, миллионы точек, миллиарды веб-страниц и т.д.; иначе говоря, мы говорим о работе с контейнерами данных потоками данных и т.д. В частности, мы не рассматриваем вопросы, как лучше выбрать набор данных, представляющих небольшой объект, такой как комплексное число, запись о температуре или окружность. Эти типы описаны в главах 9, 11 и 14.
Рассмотрим простые примеры, которые иллюстрируют наше понятие о крупном наборе данных.
• Сортировка слов в словаре.
• Поиск номера в телефонной книге по заданному имени.
• Поиск максимальной температуры.
• Поиск всех чисел, превышающих 8800.
• Поиск первого появления числа 17.
• Сортировка телеметрических записей по номерам устройств.
• Сортировка телеметрических записей по временным меткам.
• Поиск первого значения, большего, чем строка “Petersen”.
• Поиск наибольшего объема.
• Поиск первого несовпадения между двумя последовательностями.
• Вычисление попарного произведения элементов двух последовательностей.
• Поиск наибольшей месячной температуры.
• Поиск первых десяти лучших продавцов по записям о продажах.
• Подсчет количества появлений слова “Stroustrup” в сети веб.
• Вычисление суммы элементов.
Обратите внимание на то, что каждую из этих задач мы можем описать, не упоминая о способе хранения данных. Очевидно, что мы как-то должны работать со списками, векторами, файлами, потоками ввода и т.д., но мы не обязаны знать, как именно хранятся (и собираются) данные, чтобы говорить о том, что будем делать с ними. Важен лишь тип значений или объектов (тип элементов), способ доступа к этим значениям или объектам, а также что именно мы хотим с ними сделать.
Эти виды задач носят универсальный характер. Естественно, мы хотим написать код, который решал бы эти задачи просто и эффективно. В то же время перед нами, как программистами, стоят следующие проблемы.
• Существует бесконечное множество вариантов типов данных (виды данных).
• Существует огромное количество способов организации коллекций данных.
• Существует громадное количество задач, которые мы хотели бы решить с помощью коллекций данных.
Для того чтобы минимизировать влияние этих проблем, мы хотели бы как можно больше обобщить наш код, чтобы он с одинаковым успехом мог работать с разными типами данных, учитывать разные способы их хранения и решать разные задачи, связанные с обработкой данных. Иначе говоря, мы хотим обобщить наш код, чтобы охватить все варианты. Мы действительно не хотим решать каждую задачу с нуля; это слишком утомительная потеря времени.
Для того чтобы понять, какая поддержка нам нужна, чтобы написать наш код, рассмотрим, что мы можем делать с данными, более абстрактно. Итак, можно сделать следующее.
• Собирать данные в контейнерах
• например, собирать их в объектах классов
vectorlist• Организовывать данные
• для печати;
• для быстрого доступа.
• Искать данные
• по индексу (например, найти 42-й элемент);
• по значению (например, найти первую запись, в которой в поле “age” записано число 7);
• по свойствам (например, все записи, в которых значение поля “temperature” больше 32 и меньше 100).
• Модифицировать контейнер
• добавлять данные;
• удалять данные;
• сортировать (в соответствии с каким-то критерием).
• Выполнять простые математические операции (например, умножить все элементы на 1,7).
Мы хотели бы делать все это, не утонув в море информации, касающейся отличий между контейнерами, способами доступа к элементам и их типами. Если нам это удастся, то мы сделаем рывок по направлению к своей цели и получим эффективный метод работы с большими объемами данных.
Оглядываясь назад на методы и инструменты программирования, описанные в предыдущих главах, мы видим, что уже можем писать программы, не зависящие от типа используемых данных. Этот вывод основан на следующих фактах.
• Использование типа
intdouble• Использование типа
vector<int>vector<string>• Использование массива чисел типа
doublevector<double>
• Поиск значения в объекте класса
vector• Поиск объекта класса
stringstring• Графическое изображение экспериментальных данных с точными значениями не должно отличаться от графического изображения экспериментальных данных с округленными значениями.
• Копирование файла не должно отличаться от копирования вектора.
Учитывая сказанное, мы хотим писать код, удовлетворяющий следующим условиям:
• его легко читать;
• легко модифицировать;
• он имеет систематический характер;
• он короткий;
• быстро работает.
• Единообразный доступ к данным:
• независимость от способа хранения данных;
• независимость от типа данных.
• Доступ к данным, безопасный с точки зрения типа:
• легкое перемещение по данным;
• компактное хранение данных.
• Скорость работы:
• поиск данных;
• добавление данных;
• удаление данных.
• Стандартные версии большинства широко распространенных алгоритмов таких как
copyfindsearchsortsumБиблиотека STL обеспечивает не только эти возможности. Мы изучим эту библиотеку не только потому, что она представляет собой очень полезный набор инструментов, но и потому, что является примером максимальной гибкости и эффективности. Библиотека STL была разработана Алексом Степановым (Alex Stepanov) для того, чтобы создать базу для универсальных, правильных и эффективных алгоритмов, работающих с разнообразными структурами данных. Ее целью были простота, универсальность и элегантность математики.